From d9e45ac1aca1f6a13889b7962c1807afbd95078c Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Sat, 30 Jul 2016 04:05:28 -0700 Subject: [PATCH 001/115] 8161652: Crash with assert(ft == _type) failed in PhiNode::Value() Use CastPP and CheckCastPP when NotNull and klass have to be casted on Phi with unique input. Reviewed-by: kvn --- hotspot/src/share/vm/opto/cfgnode.cpp | 46 ++++++++++++++++++++------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp index 594ffd2e70a..47606b6a599 100644 --- a/hotspot/src/share/vm/opto/cfgnode.cpp +++ b/hotspot/src/share/vm/opto/cfgnode.cpp @@ -1703,29 +1703,51 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { } if (uncasted) { - // Add a cast node between the phi to be removed and its unique input. + // Add cast nodes between the phi to be removed and its unique input. // Wait until after parsing for the type information to propagate from the casts. assert(can_reshape, "Invalid during parsing"); const Type* phi_type = bottom_type(); assert(phi_type->isa_int() || phi_type->isa_ptr(), "bad phi type"); - int opcode; - // Determine the type of cast to be added. + // Add casts to carry the control dependency of the Phi that is + // going away + Node* cast = NULL; if (phi_type->isa_int()) { - opcode = Op_CastII; + cast = ConstraintCastNode::make_cast(Op_CastII, r, uin, phi_type, true); } else { const Type* uin_type = phase->type(uin); - if ((phi_type->join(TypePtr::NOTNULL) == uin_type->join(TypePtr::NOTNULL)) || - (!phi_type->isa_oopptr() && !uin_type->isa_oopptr())) { - opcode = Op_CastPP; + if (!phi_type->isa_oopptr() && !uin_type->isa_oopptr()) { + cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, true); } else { - opcode = Op_CheckCastPP; + // Use a CastPP for a cast to not null and a CheckCastPP for + // a cast to a new klass (and both if both null-ness and + // klass change). + + // If the type of phi is not null but the type of uin may be + // null, uin's type must be casted to not null + if (phi_type->join(TypePtr::NOTNULL) == phi_type->remove_speculative() && + uin_type->join(TypePtr::NOTNULL) != uin_type->remove_speculative()) { + cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, TypePtr::NOTNULL, true); + } + + // If the type of phi and uin, both casted to not null, + // differ the klass of uin must be (check)cast'ed to match + // that of phi + if (phi_type->join_speculative(TypePtr::NOTNULL) != uin_type->join_speculative(TypePtr::NOTNULL)) { + Node* n = uin; + if (cast != NULL) { + cast = phase->transform(cast); + n = cast; + } + cast = ConstraintCastNode::make_cast(Op_CheckCastPP, r, n, phi_type, true); + } + if (cast == NULL) { + cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, true); + } } } - // Add a cast to carry the control dependency of the Phi that is - // going away - Node* cast = ConstraintCastNode::make_cast(opcode, r, uin, phi_type, true); + assert(cast != NULL, "cast should be set"); cast = phase->transform(cast); - // set all inputs to the new cast so the Phi is removed by Identity + // set all inputs to the new cast(s) so the Phi is removed by Identity PhaseIterGVN* igvn = phase->is_IterGVN(); for (uint i = 1; i < req(); i++) { set_req_X(i, cast, igvn); From 1c6137737503ba39ba0c9d8002b472ee1bfdfa1b Mon Sep 17 00:00:00 2001 From: Dean Long Date: Tue, 2 Aug 2016 11:06:25 -0700 Subject: [PATCH 002/115] 8029441: assert(!((nmethod*)_cb)->is_deopt_pc(_pc)) failed: invariant broken Move patchable check into patch_pc Reviewed-by: dcubed --- hotspot/src/cpu/sparc/vm/frame_sparc.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp index ab6aeeeeabf..de731a39e67 100644 --- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp @@ -357,12 +357,6 @@ void frame::init(intptr_t* sp, address pc, CodeBlob* cb) { _cb = CodeCache::find_blob(_pc); } _deopt_state = unknown; -#ifdef ASSERT - if ( _cb != NULL && _cb->is_compiled()) { - // Without a valid unextended_sp() we can't convert the pc to "original" - assert(!((CompiledMethod*)_cb)->is_deopt_pc(_pc), "invariant broken"); - } -#endif // ASSERT } frame::frame(intptr_t* sp, unpatchable_t, address pc, CodeBlob* cb) { @@ -534,6 +528,7 @@ frame frame::sender(RegisterMap* map) const { void frame::patch_pc(Thread* thread, address pc) { + vmassert(_deopt_state != unknown, "frame is unpatchable"); if(thread == Thread::current()) { StubRoutines::Sparc::flush_callers_register_windows_func()(); } From 08bdecf0c434049ed84c1a7c05fabbf3a40cc202 Mon Sep 17 00:00:00 2001 From: Joseph Provino Date: Tue, 2 Aug 2016 16:39:33 -0400 Subject: [PATCH 003/115] 8071770: G1 does not implement millis_since_last_gc which is needed by RMI GC G1 does not return a correct value for the CollectedHeap::millis_since_last_gc Reviewed-by: jmasa, tschatzl --- hotspot/src/share/vm/gc/g1/g1Analytics.cpp | 6 +++++- hotspot/src/share/vm/gc/g1/g1Analytics.hpp | 1 + hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp | 16 ++++++++++++++-- hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp | 2 +- .../src/share/vm/gc/shared/genCollectedHeap.cpp | 14 +++++++------- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/hotspot/src/share/vm/gc/g1/g1Analytics.cpp b/hotspot/src/share/vm/gc/g1/g1Analytics.cpp index c43b4169e49..8214a4bfa55 100644 --- a/hotspot/src/share/vm/gc/g1/g1Analytics.cpp +++ b/hotspot/src/share/vm/gc/g1/g1Analytics.cpp @@ -316,10 +316,14 @@ size_t G1Analytics::predict_pending_cards() const { return get_new_size_prediction(_pending_cards_seq); } -double G1Analytics::last_known_gc_end_time_sec() const { +double G1Analytics::oldest_known_gc_end_time_sec() const { return _recent_prev_end_times_for_all_gcs_sec->oldest(); } +double G1Analytics::last_known_gc_end_time_sec() const { + return _recent_prev_end_times_for_all_gcs_sec->last(); +} + void G1Analytics::update_recent_gc_times(double end_time_sec, double pause_time_ms) { _recent_gc_times_ms->add(pause_time_ms); diff --git a/hotspot/src/share/vm/gc/g1/g1Analytics.hpp b/hotspot/src/share/vm/gc/g1/g1Analytics.hpp index a22d0dd72bd..3f9a37a98e7 100644 --- a/hotspot/src/share/vm/gc/g1/g1Analytics.hpp +++ b/hotspot/src/share/vm/gc/g1/g1Analytics.hpp @@ -155,6 +155,7 @@ public: void update_recent_gc_times(double end_time_sec, double elapsed_ms); void compute_pause_time_ratio(double interval_ms, double pause_time_ms); + double oldest_known_gc_end_time_sec() const; double last_known_gc_end_time_sec() const; }; diff --git a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp index d84e1000763..a267098ed86 100644 --- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp @@ -28,6 +28,7 @@ #include "classfile/symbolTable.hpp" #include "code/codeCache.hpp" #include "code/icBuffer.hpp" +#include "gc/g1/g1Analytics.hpp" #include "gc/g1/bufferingOopClosure.hpp" #include "gc/g1/concurrentG1Refine.hpp" #include "gc/g1/concurrentG1RefineThread.hpp" @@ -2473,8 +2474,19 @@ size_t G1CollectedHeap::max_capacity() const { } jlong G1CollectedHeap::millis_since_last_gc() { - // assert(false, "NYI"); - return 0; + jlong now = os::elapsed_counter() / NANOSECS_PER_MILLISEC; + const G1Analytics* analytics = _g1_policy->analytics(); + double last = analytics->last_known_gc_end_time_sec(); + jlong ret_val = now - (last * 1000); + if (ret_val < 0) { + // See the notes in GenCollectedHeap::millis_since_last_gc() + // for more information about the implementation. + log_warning(gc)("Detected clock going backwards. " + "Milliseconds since last GC would be " JLONG_FORMAT + ". returning zero instead.", ret_val); + return 0; + } + return ret_val; } void G1CollectedHeap::prepare_for_verify() { diff --git a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp index 454f73bc0c6..dfef9538ba7 100644 --- a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp +++ b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp @@ -604,7 +604,7 @@ void G1DefaultPolicy::record_collection_pause_end(double pause_time_ms, size_t c _analytics->report_alloc_rate_ms(alloc_rate_ms); double interval_ms = - (end_time_sec - _analytics->last_known_gc_end_time_sec()) * 1000.0; + (end_time_sec - _analytics->oldest_known_gc_end_time_sec()) * 1000.0; _analytics->update_recent_gc_times(end_time_sec, pause_time_ms); _analytics->compute_pause_time_ratio(interval_ms, pause_time_ms); } diff --git a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp index 049b675bd51..c1a28350047 100644 --- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp @@ -1256,21 +1256,21 @@ class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure { }; jlong GenCollectedHeap::millis_since_last_gc() { - // We need a monotonically non-decreasing time in ms but - // os::javaTimeMillis() does not guarantee monotonicity. + // javaTimeNanos() is guaranteed to be monotonically non-decreasing + // provided the underlying platform provides such a time source + // (and it is bug free). So we still have to guard against getting + // back a time later than 'now'. jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC; GenTimeOfLastGCClosure tolgc_cl(now); // iterate over generations getting the oldest // time that a generation was collected generation_iterate(&tolgc_cl, false); - // javaTimeNanos() is guaranteed to be monotonically non-decreasing - // provided the underlying platform provides such a time source - // (and it is bug free). So we still have to guard against getting - // back a time later than 'now'. jlong retVal = now - tolgc_cl.time(); if (retVal < 0) { - NOT_PRODUCT(log_warning(gc)("time warp: " JLONG_FORMAT, retVal);) + log_warning(gc)("Detected clock going backwards. " + "Milliseconds since last GC would be " JLONG_FORMAT + ". returning zero instead.", retVal); return 0; } return retVal; From 8a3dd8c557a732903ca762c60d8fd2af747bc154 Mon Sep 17 00:00:00 2001 From: Gerald Thornbrugh Date: Tue, 2 Aug 2016 13:48:07 -0700 Subject: [PATCH 004/115] 8161696: [TESTBUG] runtime/StackGuardPages/testme.sh uses invalid argument -Xss328k Changed argument from 328k to 1M Reviewed-by: dcubed, fparain, dholmes --- hotspot/test/runtime/StackGuardPages/exeinvoke.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/runtime/StackGuardPages/exeinvoke.c b/hotspot/test/runtime/StackGuardPages/exeinvoke.c index fa2a06e9869..da77e42ba7b 100644 --- a/hotspot/test/runtime/StackGuardPages/exeinvoke.c +++ b/hotspot/test/runtime/StackGuardPages/exeinvoke.c @@ -242,7 +242,7 @@ int main (int argc, const char** argv) { CLASS_PATH_OPT, javaclasspath); options[0].optionString = "-Xint"; - options[1].optionString = "-Xss328k"; + options[1].optionString = "-Xss1M"; options[2].optionString = javaclasspathopt; vm_args.version = JNI_VERSION_1_2; From d77fbe8b1b36a22b29e2deabb02b8cafac633d4f Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Tue, 2 Aug 2016 17:12:16 -0700 Subject: [PATCH 005/115] 8162477: [JVMCI] assert(wf.check_method_context(ctxk, m)) failed: proper context Reviewed-by: kvn --- hotspot/src/share/vm/code/dependencies.cpp | 27 ++++++++++------- ...icateSimpleSingleImplementerInterface.java | 28 ++++++++++++++++++ .../testcases/MultipleSuperImplementers.java | 29 +++++++++++++++++++ .../SimpleSingleImplementerInterface.java | 28 ++++++++++++++++++ .../FindUniqueConcreteMethodTest.java | 25 ++++++++++++---- 5 files changed, 122 insertions(+), 15 deletions(-) create mode 100644 hotspot/test/compiler/jvmci/common/testcases/DuplicateSimpleSingleImplementerInterface.java create mode 100644 hotspot/test/compiler/jvmci/common/testcases/MultipleSuperImplementers.java create mode 100644 hotspot/test/compiler/jvmci/common/testcases/SimpleSingleImplementerInterface.java diff --git a/hotspot/src/share/vm/code/dependencies.cpp b/hotspot/src/share/vm/code/dependencies.cpp index 8bcef277d2a..d33df4eda1b 100644 --- a/hotspot/src/share/vm/code/dependencies.cpp +++ b/hotspot/src/share/vm/code/dependencies.cpp @@ -1082,12 +1082,11 @@ class ClassHierarchyWalker { if (!(m->is_public() || m->is_protected())) // The override story is complex when packages get involved. return true; // Must punt the assertion to true. - Klass* k = ctxk; - Method* lm = k->lookup_method(m->name(), m->signature()); - if (lm == NULL && k->is_instance_klass()) { + Method* lm = ctxk->lookup_method(m->name(), m->signature()); + if (lm == NULL && ctxk->is_instance_klass()) { // It might be an interface method - lm = InstanceKlass::cast(k)->lookup_method_in_ordered_interfaces(m->name(), - m->signature()); + lm = InstanceKlass::cast(ctxk)->lookup_method_in_ordered_interfaces(m->name(), + m->signature()); } if (lm == m) // Method m is inherited into ctxk. @@ -1101,11 +1100,19 @@ class ClassHierarchyWalker { // Static methods don't override non-static so punt return true; } - if ( !Dependencies::is_concrete_method(lm, k) - && !Dependencies::is_concrete_method(m, ctxk) - && lm->method_holder()->is_subtype_of(m->method_holder())) - // Method m is overridden by lm, but both are non-concrete. - return true; + if (!Dependencies::is_concrete_method(lm, ctxk) && + !Dependencies::is_concrete_method(m, ctxk)) { + // They are both non-concrete + if (lm->method_holder()->is_subtype_of(m->method_holder())) { + // Method m is overridden by lm, but both are non-concrete. + return true; + } + if (lm->method_holder()->is_interface() && m->method_holder()->is_interface() && + ctxk->is_subtype_of(m->method_holder()) && ctxk->is_subtype_of(lm->method_holder())) { + // Interface method defined in multiple super interfaces + return true; + } + } } ResourceMark rm; tty->print_cr("Dependency method not found in the associated context:"); diff --git a/hotspot/test/compiler/jvmci/common/testcases/DuplicateSimpleSingleImplementerInterface.java b/hotspot/test/compiler/jvmci/common/testcases/DuplicateSimpleSingleImplementerInterface.java new file mode 100644 index 00000000000..03f18e92a70 --- /dev/null +++ b/hotspot/test/compiler/jvmci/common/testcases/DuplicateSimpleSingleImplementerInterface.java @@ -0,0 +1,28 @@ +/* + * 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 compiler.jvmci.common.testcases; + +public interface DuplicateSimpleSingleImplementerInterface { + void interfaceMethod(); +} diff --git a/hotspot/test/compiler/jvmci/common/testcases/MultipleSuperImplementers.java b/hotspot/test/compiler/jvmci/common/testcases/MultipleSuperImplementers.java new file mode 100644 index 00000000000..d7f297e6101 --- /dev/null +++ b/hotspot/test/compiler/jvmci/common/testcases/MultipleSuperImplementers.java @@ -0,0 +1,29 @@ +/* + * 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 compiler.jvmci.common.testcases; + +public abstract class MultipleSuperImplementers implements DuplicateSimpleSingleImplementerInterface, SimpleSingleImplementerInterface { + public void finalize() { + } +} diff --git a/hotspot/test/compiler/jvmci/common/testcases/SimpleSingleImplementerInterface.java b/hotspot/test/compiler/jvmci/common/testcases/SimpleSingleImplementerInterface.java new file mode 100644 index 00000000000..4f03bbb761c --- /dev/null +++ b/hotspot/test/compiler/jvmci/common/testcases/SimpleSingleImplementerInterface.java @@ -0,0 +1,28 @@ +/* + * 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 compiler.jvmci.common.testcases; + +public interface SimpleSingleImplementerInterface { + void interfaceMethod(); +} diff --git a/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java b/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java index 3c818d9f2d5..5eccc6d1164 100644 --- a/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java +++ b/hotspot/test/compiler/jvmci/compilerToVM/FindUniqueConcreteMethodTest.java @@ -32,6 +32,8 @@ * java.base/jdk.internal.org.objectweb.asm.tree * jdk.vm.ci/jdk.vm.ci.hotspot * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build compiler.jvmci.compilerToVM.FindUniqueConcreteMethodTest * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI @@ -41,7 +43,10 @@ package compiler.jvmci.compilerToVM; import compiler.jvmci.common.CTVMUtilities; +import compiler.jvmci.common.testcases.DuplicateSimpleSingleImplementerInterface; +import compiler.jvmci.common.testcases.SimpleSingleImplementerInterface; import compiler.jvmci.common.testcases.MultipleImplementer1; +import compiler.jvmci.common.testcases.MultipleSuperImplementers; import compiler.jvmci.common.testcases.SingleImplementer; import compiler.jvmci.common.testcases.SingleImplementerInterface; import compiler.jvmci.common.testcases.SingleSubclass; @@ -96,6 +101,11 @@ public class FindUniqueConcreteMethodTest { // static method result.add(new TestCase(false, SingleSubclass.class, SingleSubclass.class, "staticMethod")); + // interface method + result.add(new TestCase(false, MultipleSuperImplementers.class, + DuplicateSimpleSingleImplementerInterface.class, "interfaceMethod", false)); + result.add(new TestCase(false, MultipleSuperImplementers.class, + SimpleSingleImplementerInterface.class, "interfaceMethod", false)); return result; } @@ -103,7 +113,7 @@ public class FindUniqueConcreteMethodTest { System.out.println(tcase); Method method = tcase.holder.getDeclaredMethod(tcase.methodName); HotSpotResolvedJavaMethod testMethod = CTVMUtilities - .getResolvedMethod(tcase.receiver, method); + .getResolvedMethod(tcase.methodFromReceiver ? tcase.receiver : tcase.holder, method); HotSpotResolvedObjectType resolvedType = CompilerToVMHelper .lookupType(Utils.toJVMTypeSignature(tcase.receiver), getClass(), /* resolve = */ true); @@ -118,20 +128,25 @@ public class FindUniqueConcreteMethodTest { public final Class holder; public final String methodName; public final boolean isPositive; + public final boolean methodFromReceiver; public TestCase(boolean isPositive, Class clazz, Class holder, - String methodName) { + String methodName, boolean methodFromReceiver) { this.receiver = clazz; this.methodName = methodName; this.isPositive = isPositive; this.holder = holder; + this.methodFromReceiver = methodFromReceiver; + } + + public TestCase(boolean isPositive, Class clazz, Class holder, String methodName) { + this(isPositive, clazz, holder, methodName, true); } @Override public String toString() { - return String.format("CASE: receiver=%s, holder=%s, method=%s," - + " isPositive=%s", receiver.getName(), - holder.getName(), methodName, isPositive); + return String.format("CASE: receiver=%s, holder=%s, method=%s, isPositive=%s, methodFromReceiver=%s", + receiver.getName(), holder.getName(), methodName, isPositive, methodFromReceiver); } } } From 836b73b338bf9bb7f57d0dee3f393aba0b064427 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Tue, 2 Aug 2016 19:46:29 -0700 Subject: [PATCH 006/115] 8163018: Slow compiler tests in JPRT Fixed test/TEST.groups and added -XX:-TieredCompilation to Test6792161 test. Reviewed-by: dholmes, dcubed --- hotspot/test/TEST.groups | 4 ++-- hotspot/test/compiler/c2/Test6792161.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot/test/TEST.groups b/hotspot/test/TEST.groups index e1bdec26de5..c87769b91e1 100644 --- a/hotspot/test/TEST.groups +++ b/hotspot/test/TEST.groups @@ -167,7 +167,7 @@ needs_compact3 = \ gc/survivorAlignment \ runtime/InternalApi/ThreadCpuTimesDeadlock.java \ runtime/NMT/JcmdSummaryDiff.java \ - runtime/RedefineTests/RedefineAnnotations.java + runtime/RedefineTests/RedefineAnnotations.java \ serviceability/sa/jmap-hashcode/Test8028623.java \ serviceability/threads/TestFalseDeadLock.java \ compiler/codecache/jmx \ @@ -282,7 +282,7 @@ hotspot_fast_compiler_1 = \ -compiler/c2/Test6905845.java \ -compiler/c2/cr6340864 \ -compiler/c2/cr6589834 \ - -compiler/c2/cr8004867 + -compiler/c2/cr8004867 \ -compiler/c2/stemmer \ -compiler/c2/Test6792161.java \ -compiler/c2/Test6603011.java \ diff --git a/hotspot/test/compiler/c2/Test6792161.java b/hotspot/test/compiler/c2/Test6792161.java index fa4aaddcdfd..c2b22412681 100644 --- a/hotspot/test/compiler/c2/Test6792161.java +++ b/hotspot/test/compiler/c2/Test6792161.java @@ -27,7 +27,7 @@ * @bug 6792161 * @summary assert("No dead instructions after post-alloc") * - * @run main/othervm/timeout=600 -Xcomp -XX:MaxInlineSize=120 compiler.c2.Test6792161 + * @run main/othervm/timeout=600 -Xcomp -XX:-TieredCompilation -XX:MaxInlineSize=120 compiler.c2.Test6792161 */ package compiler.c2; From d9c6c4744afda6d29cde0a5bde3ac78482686a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Bourg=C3=A8s?= Date: Wed, 3 Aug 2016 22:53:38 +0200 Subject: [PATCH 007/115] 8159638: Improve array caches and renderer stats in Marlin renderer Byte/Float/Int ArrayCache (Reference) refactoring + improved cache statistics and tuning settings Reviewed-by: flar, prr --- .../{ArrayCache.java => ArrayCacheConst.java} | 211 ++++++---- .../sun/java2d/marlin/ByteArrayCache.java | 269 +++++++++---- .../classes/sun/java2d/marlin/Dasher.java | 30 +- .../sun/java2d/marlin/FloatArrayCache.java | 270 +++++++++---- .../sun/java2d/marlin/IntArrayCache.java | 269 +++++++++---- .../sun/java2d/marlin/MarlinCache.java | 33 +- .../sun/java2d/marlin/MarlinConst.java | 17 +- .../sun/java2d/marlin/MarlinProperties.java | 20 +- .../java2d/marlin/MarlinRenderingEngine.java | 85 ++-- .../classes/sun/java2d/marlin/Renderer.java | 257 ++++++------ .../sun/java2d/marlin/RendererContext.java | 369 +++--------------- .../sun/java2d/marlin/RendererStats.java | 222 +++++++---- .../classes/sun/java2d/marlin/Stroker.java | 50 +-- .../classes/sun/java2d/marlin/Version.java | 2 +- .../sun/java2d/marlin/ArrayCacheSizeTest.java | 6 +- 15 files changed, 1153 insertions(+), 957 deletions(-) rename jdk/src/java.desktop/share/classes/sun/java2d/marlin/{ArrayCache.java => ArrayCacheConst.java} (56%) diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCacheConst.java similarity index 56% rename from jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCache.java rename to jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCacheConst.java index 5f36e0d7ce5..5cc9cf84ed5 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ArrayCacheConst.java @@ -28,60 +28,45 @@ package sun.java2d.marlin; import java.util.Arrays; import static sun.java2d.marlin.MarlinUtils.logInfo; -public final class ArrayCache implements MarlinConst { +public final class ArrayCacheConst implements MarlinConst { - static final int BUCKETS = 4; + static final int BUCKETS = 8; static final int MIN_ARRAY_SIZE = 4096; + // maximum array size static final int MAX_ARRAY_SIZE; - static final int MASK_CLR_1 = ~1; + // threshold below to grow arrays by 4 + static final int THRESHOLD_SMALL_ARRAY_SIZE = 4 * 1024 * 1024; // threshold to grow arrays only by (3/2) instead of 2 static final int THRESHOLD_ARRAY_SIZE; - static final int[] ARRAY_SIZES = new int[BUCKETS]; - // dirty byte array sizes - static final int MIN_DIRTY_BYTE_ARRAY_SIZE = 32 * 2048; // 32px x 2048px - static final int MAX_DIRTY_BYTE_ARRAY_SIZE; - static final int[] DIRTY_BYTE_ARRAY_SIZES = new int[BUCKETS]; - // large array thresholds: - static final long THRESHOLD_LARGE_ARRAY_SIZE; + // threshold to grow arrays only by (5/4) instead of (3/2) static final long THRESHOLD_HUGE_ARRAY_SIZE; - // stats - private static int resizeInt = 0; - private static int resizeDirtyInt = 0; - private static int resizeDirtyFloat = 0; - private static int resizeDirtyByte = 0; - private static int oversize = 0; + static final int[] ARRAY_SIZES = new int[BUCKETS]; static { // initialize buckets for int/float arrays int arraySize = MIN_ARRAY_SIZE; - for (int i = 0; i < BUCKETS; i++, arraySize <<= 2) { + int inc_lg = 2; // x4 + + for (int i = 0; i < BUCKETS; i++, arraySize <<= inc_lg) { ARRAY_SIZES[i] = arraySize; if (DO_TRACE) { logInfo("arraySize[" + i + "]: " + arraySize); } - } - MAX_ARRAY_SIZE = arraySize >> 2; - /* initialize buckets for dirty byte arrays - (large AA chunk = 32 x 2048 pixels) */ - arraySize = MIN_DIRTY_BYTE_ARRAY_SIZE; - - for (int i = 0; i < BUCKETS; i++, arraySize <<= 1) { - DIRTY_BYTE_ARRAY_SIZES[i] = arraySize; - - if (DO_TRACE) { - logInfo("dirty arraySize[" + i + "]: " + arraySize); + if (arraySize >= THRESHOLD_SMALL_ARRAY_SIZE) { + inc_lg = 1; // x2 } } - MAX_DIRTY_BYTE_ARRAY_SIZE = arraySize >> 1; + MAX_ARRAY_SIZE = arraySize >> inc_lg; - // threshold to grow arrays only by (3/2) instead of 2 - THRESHOLD_ARRAY_SIZE = Math.max(2 * 1024 * 1024, MAX_ARRAY_SIZE); // 2M + if (MAX_ARRAY_SIZE <= 0) { + throw new IllegalStateException("Invalid max array size !"); + } - THRESHOLD_LARGE_ARRAY_SIZE = 8L * THRESHOLD_ARRAY_SIZE; // 16M - THRESHOLD_HUGE_ARRAY_SIZE = 8L * THRESHOLD_LARGE_ARRAY_SIZE; // 128M + THRESHOLD_ARRAY_SIZE = 16 * 1024 * 1024; // >16M + THRESHOLD_HUGE_ARRAY_SIZE = 48L * 1024 * 1024; // >48M if (DO_STATS || DO_MONITORS) { logInfo("ArrayCache.BUCKETS = " + BUCKETS); @@ -89,56 +74,17 @@ public final class ArrayCache implements MarlinConst { logInfo("ArrayCache.MAX_ARRAY_SIZE = " + MAX_ARRAY_SIZE); logInfo("ArrayCache.ARRAY_SIZES = " + Arrays.toString(ARRAY_SIZES)); - logInfo("ArrayCache.MIN_DIRTY_BYTE_ARRAY_SIZE = " - + MIN_DIRTY_BYTE_ARRAY_SIZE); - logInfo("ArrayCache.MAX_DIRTY_BYTE_ARRAY_SIZE = " - + MAX_DIRTY_BYTE_ARRAY_SIZE); - logInfo("ArrayCache.ARRAY_SIZES = " - + Arrays.toString(DIRTY_BYTE_ARRAY_SIZES)); logInfo("ArrayCache.THRESHOLD_ARRAY_SIZE = " + THRESHOLD_ARRAY_SIZE); - logInfo("ArrayCache.THRESHOLD_LARGE_ARRAY_SIZE = " - + THRESHOLD_LARGE_ARRAY_SIZE); logInfo("ArrayCache.THRESHOLD_HUGE_ARRAY_SIZE = " + THRESHOLD_HUGE_ARRAY_SIZE); } } - private ArrayCache() { + private ArrayCacheConst() { // Utility class } - static synchronized void incResizeInt() { - resizeInt++; - } - - static synchronized void incResizeDirtyInt() { - resizeDirtyInt++; - } - - static synchronized void incResizeDirtyFloat() { - resizeDirtyFloat++; - } - - static synchronized void incResizeDirtyByte() { - resizeDirtyByte++; - } - - static synchronized void incOversize() { - oversize++; - } - - static void dumpStats() { - if (resizeInt != 0 || resizeDirtyInt != 0 || resizeDirtyFloat != 0 - || resizeDirtyByte != 0 || oversize != 0) { - logInfo("ArrayCache: int resize: " + resizeInt - + " - dirty int resize: " + resizeDirtyInt - + " - dirty float resize: " + resizeDirtyFloat - + " - dirty byte resize: " + resizeDirtyByte - + " - oversize: " + oversize); - } - } - // small methods used a lot (to be inlined / optimized by hotspot) static int getBucket(final int length) { @@ -150,15 +96,6 @@ public final class ArrayCache implements MarlinConst { return -1; } - static int getBucketDirtyBytes(final int length) { - for (int i = 0; i < DIRTY_BYTE_ARRAY_SIZES.length; i++) { - if (length <= DIRTY_BYTE_ARRAY_SIZES[i]) { - return i; - } - } - return -1; - } - /** * Return the new array size (~ x2) * @param curSize current used size @@ -174,7 +111,7 @@ public final class ArrayCache implements MarlinConst { "array exceeds maximum capacity !"); } assert curSize >= 0; - final int initial = (curSize & MASK_CLR_1); + final int initial = curSize; int size; if (initial > THRESHOLD_ARRAY_SIZE) { size = initial + (initial >> 1); // x(3/2) @@ -212,10 +149,12 @@ public final class ArrayCache implements MarlinConst { long size; if (curSize > THRESHOLD_HUGE_ARRAY_SIZE) { size = curSize + (curSize >> 2L); // x(5/4) - } else if (curSize > THRESHOLD_LARGE_ARRAY_SIZE) { + } else if (curSize > THRESHOLD_ARRAY_SIZE) { size = curSize + (curSize >> 1L); // x(3/2) - } else { + } else if (curSize > THRESHOLD_SMALL_ARRAY_SIZE) { size = (curSize << 1L); // x2 + } else { + size = (curSize << 2L); // x4 } // ensure the new size is >= needed size: if (size < needSize) { @@ -229,4 +168,106 @@ public final class ArrayCache implements MarlinConst { } return size; } + + static final class CacheStats { + final String name; + final BucketStats[] bucketStats; + int resize = 0; + int oversize = 0; + long totalInitial = 0L; + + CacheStats(final String name) { + this.name = name; + + bucketStats = new BucketStats[BUCKETS]; + for (int i = 0; i < BUCKETS; i++) { + bucketStats[i] = new BucketStats(); + } + } + + void reset() { + resize = 0; + oversize = 0; + + for (int i = 0; i < BUCKETS; i++) { + bucketStats[i].reset(); + } + } + + long dumpStats() { + long totalCacheBytes = 0L; + + if (DO_STATS) { + for (int i = 0; i < BUCKETS; i++) { + final BucketStats s = bucketStats[i]; + + if (s.maxSize != 0) { + totalCacheBytes += getByteFactor() + * (s.maxSize * ARRAY_SIZES[i]); + } + } + + if (totalInitial != 0L || totalCacheBytes != 0L + || resize != 0 || oversize != 0) + { + logInfo(name + ": resize: " + resize + + " - oversize: " + oversize + + " - initial: " + getTotalInitialBytes() + + " bytes (" + totalInitial + " elements)" + + " - cache: " + totalCacheBytes + " bytes" + ); + } + + if (totalCacheBytes != 0L) { + logInfo(name + ": usage stats:"); + + for (int i = 0; i < BUCKETS; i++) { + final BucketStats s = bucketStats[i]; + + if (s.getOp != 0) { + logInfo(" Bucket[" + ARRAY_SIZES[i] + "]: " + + "get: " + s.getOp + + " - put: " + s.returnOp + + " - create: " + s.createOp + + " :: max size: " + s.maxSize + ); + } + } + } + } + return totalCacheBytes; + } + + private int getByteFactor() { + int factor = 1; + if (name.contains("Int") || name.contains("Float")) { + factor = 4; + } + return factor; + } + + long getTotalInitialBytes() { + return getByteFactor() * totalInitial; + } + } + + static final class BucketStats { + int getOp = 0; + int createOp = 0; + int returnOp = 0; + int maxSize = 0; + + void reset() { + getOp = 0; + createOp = 0; + returnOp = 0; + maxSize = 0; + } + + void updateMaxSize(final int size) { + if (size > maxSize) { + maxSize = size; + } + } + } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java index 7854795dfd3..869b050098f 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java @@ -22,109 +22,224 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package sun.java2d.marlin; -import java.util.ArrayDeque; -import java.util.Arrays; -import static sun.java2d.marlin.MarlinUtils.logException; +import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES; +import static sun.java2d.marlin.ArrayCacheConst.BUCKETS; +import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE; import static sun.java2d.marlin.MarlinUtils.logInfo; +import static sun.java2d.marlin.MarlinUtils.logException; + +import java.lang.ref.WeakReference; +import java.util.Arrays; + +import sun.java2d.marlin.ArrayCacheConst.BucketStats; +import sun.java2d.marlin.ArrayCacheConst.CacheStats; + +/* + * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except + * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file + * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java + * files are generated with the following command lines: + */ +// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java +// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java final class ByteArrayCache implements MarlinConst { - private final int arraySize; - private final ArrayDeque byteArrays; - // stats - private int getOp = 0; - private int createOp = 0; - private int returnOp = 0; + final boolean clean; + private final int bucketCapacity; + private WeakReference refBuckets = null; + final CacheStats stats; - void dumpStats() { - if (getOp > 0) { - logInfo("ByteArrayCache[" + arraySize + "]: get: " + getOp - + " created: " + createOp + " - returned: " + returnOp - + " :: cache size: " + byteArrays.size()); - } + ByteArrayCache(final boolean clean, final int bucketCapacity) { + this.clean = clean; + this.bucketCapacity = bucketCapacity; + this.stats = (DO_STATS) ? + new CacheStats(getLogPrefix(clean) + "ByteArrayCache") : null; } - ByteArrayCache(final int arraySize) { - this.arraySize = arraySize; - // small but enough: almost 1 cache line - this.byteArrays = new ArrayDeque(6); + Bucket getCacheBucket(final int length) { + final int bucket = ArrayCacheConst.getBucket(length); + return getBuckets()[bucket]; } - byte[] getArray() { - if (DO_STATS) { - getOp++; - } + private Bucket[] getBuckets() { + // resolve reference: + Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null; - // use cache: - final byte[] array = byteArrays.pollLast(); - if (array != null) { - return array; - } + // create a new buckets ? + if (buckets == null) { + buckets = new Bucket[BUCKETS]; - if (DO_STATS) { - createOp++; - } - - return new byte[arraySize]; - } - - void putDirtyArray(final byte[] array, final int length) { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + for (int i = 0; i < BUCKETS; i++) { + buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity, + (DO_STATS) ? stats.bucketStats[i] : null); } - return; - } - if (DO_STATS) { - returnOp++; - } - // NO clean-up of array data = DIRTY ARRAY - - if (DO_CLEAN_DIRTY) { - // Force zero-fill dirty arrays: - Arrays.fill(array, 0, array.length, BYTE_0); + // update weak reference: + refBuckets = new WeakReference(buckets); } - - // fill cache: - byteArrays.addLast(array); + return buckets; } - void putArray(final byte[] array, final int length, - final int fromIndex, final int toIndex) - { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + Reference createRef(final int initialSize) { + return new Reference(this, initialSize); + } + + static final class Reference { + + // initial array reference (direct access) + final byte[] initial; + private final boolean clean; + private final ByteArrayCache cache; + + Reference(final ByteArrayCache cache, final int initialSize) { + this.cache = cache; + this.clean = cache.clean; + this.initial = createArray(initialSize, clean); + if (DO_STATS) { + cache.stats.totalInitial += initialSize; } - return; - } - if (DO_STATS) { - returnOp++; } - // clean-up array of dirty part[fromIndex; toIndex[ - fill(array, fromIndex, toIndex, BYTE_0); + byte[] getArray(final int length) { + if (length <= MAX_ARRAY_SIZE) { + return cache.getCacheBucket(length).getArray(); + } + if (DO_STATS) { + cache.stats.oversize++; + } + if (DO_LOG_OVERSIZE) { + logInfo(getLogPrefix(clean) + "ByteArrayCache: " + + "getArray[oversize]: length=\t" + length); + } + return createArray(length, clean); + } - // fill cache: - byteArrays.addLast(array); + byte[] widenArray(final byte[] array, final int usedSize, + final int needSize) + { + final int length = array.length; + if (DO_CHECKS && length >= needSize) { + return array; + } + if (DO_STATS) { + cache.stats.resize++; + } + + // maybe change bucket: + // ensure getNewSize() > newSize: + final byte[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize)); + + // use wrapper to ensure proper copy: + System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements + + // maybe return current array: + putArray(array, 0, usedSize); // ensure array is cleared + + if (DO_LOG_WIDEN_ARRAY) { + logInfo(getLogPrefix(clean) + "ByteArrayCache: " + + "widenArray[" + res.length + + "]: usedSize=\t" + usedSize + "\tlength=\t" + length + + "\tneeded length=\t" + needSize); + } + return res; + } + + byte[] putArray(final byte[] array) + { + // dirty array helper: + return putArray(array, 0, array.length); + } + + byte[] putArray(final byte[] array, final int fromIndex, + final int toIndex) + { + if (array.length <= MAX_ARRAY_SIZE) { + if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) { + // clean-up array of dirty part[fromIndex; toIndex[ + fill(array, fromIndex, toIndex, (byte)0); + } + // ensure to never store initial arrays in cache: + if (array != initial) { + cache.getCacheBucket(array.length).putArray(array); + } + } + return initial; + } + } + + static final class Bucket { + + private int tail = 0; + private final int arraySize; + private final boolean clean; + private final byte[][] arrays; + private final BucketStats stats; + + Bucket(final boolean clean, final int arraySize, + final int capacity, final BucketStats stats) + { + this.arraySize = arraySize; + this.clean = clean; + this.stats = stats; + this.arrays = new byte[capacity][]; + } + + byte[] getArray() { + if (DO_STATS) { + stats.getOp++; + } + // use cache: + if (tail != 0) { + final byte[] array = arrays[--tail]; + arrays[tail] = null; + return array; + } + if (DO_STATS) { + stats.createOp++; + } + return createArray(arraySize, clean); + } + + void putArray(final byte[] array) + { + if (DO_CHECKS && (array.length != arraySize)) { + logInfo(getLogPrefix(clean) + "ByteArrayCache: " + + "bad length = " + array.length); + return; + } + if (DO_STATS) { + stats.returnOp++; + } + // fill cache: + if (arrays.length > tail) { + arrays[tail++] = array; + + if (DO_STATS) { + stats.updateMaxSize(tail); + } + } else if (DO_CHECKS) { + logInfo(getLogPrefix(clean) + "ByteArrayCache: " + + "array capacity exceeded !"); + } + } + } + + static byte[] createArray(final int length, final boolean clean) { + if (clean) { + return new byte[length]; + } + // use JDK9 Unsafe.allocateUninitializedArray(class, length): + return (byte[]) OffHeapArray.UNSAFE.allocateUninitializedArray(byte.class, length); } static void fill(final byte[] array, final int fromIndex, final int toIndex, final byte value) { // clear array data: - /* - * Arrays.fill is faster than System.arraycopy(empty array) - * or Unsafe.setMemory(byte 0) - */ - if (toIndex != 0) { - Arrays.fill(array, fromIndex, toIndex, value); - } - + Arrays.fill(array, fromIndex, toIndex, value); if (DO_CHECKS) { check(array, fromIndex, toIndex, value); } @@ -149,4 +264,8 @@ final class ByteArrayCache implements MarlinConst { } } } + + static String getLogPrefix(final boolean clean) { + return (clean) ? "Clean" : "Dirty"; + } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java index 890bbf5dd48..d272293c62d 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java @@ -68,15 +68,13 @@ final class Dasher implements sun.awt.geom.PathConsumer2D, MarlinConst { // per-thread renderer context final RendererContext rdrCtx; - // dashes array (dirty) - final float[] dashes_initial = new float[INITIAL_ARRAY]; - // flag to recycle dash array copy boolean recycleDashes; - // per-thread initial arrays (large enough to satisfy most usages - // +1 to avoid recycling in Helpers.widenArray() - private final float[] firstSegmentsBuffer_initial = new float[INITIAL_ARRAY + 1]; + // dashes ref (dirty) + final FloatArrayCache.Reference dashes_ref; + // firstSegmentsBuffer ref (dirty) + final FloatArrayCache.Reference firstSegmentsBuffer_ref; /** * Constructs a Dasher. @@ -85,7 +83,10 @@ final class Dasher implements sun.awt.geom.PathConsumer2D, MarlinConst { Dasher(final RendererContext rdrCtx) { this.rdrCtx = rdrCtx; - firstSegmentsBuffer = firstSegmentsBuffer_initial; + dashes_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K + + firstSegmentsBuffer_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K + firstSegmentsBuffer = firstSegmentsBuffer_ref.initial; // we need curCurvepts to be able to contain 2 curves because when // dashing curves, we need to subdivide it @@ -142,18 +143,12 @@ final class Dasher implements sun.awt.geom.PathConsumer2D, MarlinConst { if (DO_CLEAN_DIRTY) { // Force zero-fill dirty arrays: Arrays.fill(curCurvepts, 0f); - Arrays.fill(firstSegmentsBuffer, 0f); } // Return arrays: - if (recycleDashes && dash != dashes_initial) { - rdrCtx.putDirtyFloatArray(dash); - dash = null; - } - - if (firstSegmentsBuffer != firstSegmentsBuffer_initial) { - rdrCtx.putDirtyFloatArray(firstSegmentsBuffer); - firstSegmentsBuffer = firstSegmentsBuffer_initial; + if (recycleDashes) { + dash = dashes_ref.putArray(dash); } + firstSegmentsBuffer = firstSegmentsBuffer_ref.putArray(firstSegmentsBuffer); } @Override @@ -222,7 +217,8 @@ final class Dasher implements sun.awt.geom.PathConsumer2D, MarlinConst { .add(segIdx + len); } firstSegmentsBuffer = buf - = rdrCtx.widenDirtyFloatArray(buf, segIdx, segIdx + len); + = firstSegmentsBuffer_ref.widenArray(buf, segIdx, + segIdx + len); } buf[segIdx++] = type; len--; diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java index 87876b8c3e9..4a5905d7c39 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java @@ -22,110 +22,224 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package sun.java2d.marlin; -import java.util.ArrayDeque; -import java.util.Arrays; -import static sun.java2d.marlin.MarlinUtils.logException; +import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES; +import static sun.java2d.marlin.ArrayCacheConst.BUCKETS; +import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE; import static sun.java2d.marlin.MarlinUtils.logInfo; +import static sun.java2d.marlin.MarlinUtils.logException; + +import java.lang.ref.WeakReference; +import java.util.Arrays; + +import sun.java2d.marlin.ArrayCacheConst.BucketStats; +import sun.java2d.marlin.ArrayCacheConst.CacheStats; + +/* + * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except + * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file + * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java + * files are generated with the following command lines: + */ +// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java +// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java final class FloatArrayCache implements MarlinConst { - private final int arraySize; - private final ArrayDeque floatArrays; - // stats - private int getOp = 0; - private int createOp = 0; - private int returnOp = 0; + final boolean clean; + private final int bucketCapacity; + private WeakReference refBuckets = null; + final CacheStats stats; - void dumpStats() { - if (getOp > 0) { - logInfo("FloatArrayCache[" + arraySize + "]: get: " + getOp - + " created: " + createOp + " - returned: " + returnOp - + " :: cache size: " + floatArrays.size()); - } + FloatArrayCache(final boolean clean, final int bucketCapacity) { + this.clean = clean; + this.bucketCapacity = bucketCapacity; + this.stats = (DO_STATS) ? + new CacheStats(getLogPrefix(clean) + "FloatArrayCache") : null; } - FloatArrayCache(final int arraySize) { - this.arraySize = arraySize; - // small but enough: almost 1 cache line - this.floatArrays = new ArrayDeque(6); + Bucket getCacheBucket(final int length) { + final int bucket = ArrayCacheConst.getBucket(length); + return getBuckets()[bucket]; } - float[] getArray() { - if (DO_STATS) { - getOp++; - } + private Bucket[] getBuckets() { + // resolve reference: + Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null; - // use cache - final float[] array = floatArrays.pollLast(); + // create a new buckets ? + if (buckets == null) { + buckets = new Bucket[BUCKETS]; - if (array != null) { - return array; - } - - if (DO_STATS) { - createOp++; - } - - return new float[arraySize]; - } - - void putDirtyArray(final float[] array, final int length) { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + for (int i = 0; i < BUCKETS; i++) { + buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity, + (DO_STATS) ? stats.bucketStats[i] : null); } - return; - } - if (DO_STATS) { - returnOp++; - } - // NO clean-up of array data = DIRTY ARRAY - - if (DO_CLEAN_DIRTY) { - // Force zero-fill dirty arrays: - Arrays.fill(array, 0, array.length, 0f); + // update weak reference: + refBuckets = new WeakReference(buckets); } - - // fill cache: - floatArrays.addLast(array); + return buckets; } - void putArray(final float[] array, final int length, - final int fromIndex, final int toIndex) - { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + Reference createRef(final int initialSize) { + return new Reference(this, initialSize); + } + + static final class Reference { + + // initial array reference (direct access) + final float[] initial; + private final boolean clean; + private final FloatArrayCache cache; + + Reference(final FloatArrayCache cache, final int initialSize) { + this.cache = cache; + this.clean = cache.clean; + this.initial = createArray(initialSize, clean); + if (DO_STATS) { + cache.stats.totalInitial += initialSize; } - return; - } - if (DO_STATS) { - returnOp++; } - // clean-up array of dirty part[fromIndex; toIndex[ - fill(array, fromIndex, toIndex, 0f); + float[] getArray(final int length) { + if (length <= MAX_ARRAY_SIZE) { + return cache.getCacheBucket(length).getArray(); + } + if (DO_STATS) { + cache.stats.oversize++; + } + if (DO_LOG_OVERSIZE) { + logInfo(getLogPrefix(clean) + "FloatArrayCache: " + + "getArray[oversize]: length=\t" + length); + } + return createArray(length, clean); + } - // fill cache: - floatArrays.addLast(array); + float[] widenArray(final float[] array, final int usedSize, + final int needSize) + { + final int length = array.length; + if (DO_CHECKS && length >= needSize) { + return array; + } + if (DO_STATS) { + cache.stats.resize++; + } + + // maybe change bucket: + // ensure getNewSize() > newSize: + final float[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize)); + + // use wrapper to ensure proper copy: + System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements + + // maybe return current array: + putArray(array, 0, usedSize); // ensure array is cleared + + if (DO_LOG_WIDEN_ARRAY) { + logInfo(getLogPrefix(clean) + "FloatArrayCache: " + + "widenArray[" + res.length + + "]: usedSize=\t" + usedSize + "\tlength=\t" + length + + "\tneeded length=\t" + needSize); + } + return res; + } + + float[] putArray(final float[] array) + { + // dirty array helper: + return putArray(array, 0, array.length); + } + + float[] putArray(final float[] array, final int fromIndex, + final int toIndex) + { + if (array.length <= MAX_ARRAY_SIZE) { + if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) { + // clean-up array of dirty part[fromIndex; toIndex[ + fill(array, fromIndex, toIndex, (float) 0); + } + // ensure to never store initial arrays in cache: + if (array != initial) { + cache.getCacheBucket(array.length).putArray(array); + } + } + return initial; + } + } + + static final class Bucket { + + private int tail = 0; + private final int arraySize; + private final boolean clean; + private final float[][] arrays; + private final BucketStats stats; + + Bucket(final boolean clean, final int arraySize, + final int capacity, final BucketStats stats) + { + this.arraySize = arraySize; + this.clean = clean; + this.stats = stats; + this.arrays = new float[capacity][]; + } + + float[] getArray() { + if (DO_STATS) { + stats.getOp++; + } + // use cache: + if (tail != 0) { + final float[] array = arrays[--tail]; + arrays[tail] = null; + return array; + } + if (DO_STATS) { + stats.createOp++; + } + return createArray(arraySize, clean); + } + + void putArray(final float[] array) + { + if (DO_CHECKS && (array.length != arraySize)) { + logInfo(getLogPrefix(clean) + "FloatArrayCache: " + + "bad length = " + array.length); + return; + } + if (DO_STATS) { + stats.returnOp++; + } + // fill cache: + if (arrays.length > tail) { + arrays[tail++] = array; + + if (DO_STATS) { + stats.updateMaxSize(tail); + } + } else if (DO_CHECKS) { + logInfo(getLogPrefix(clean) + "FloatArrayCache: " + + "array capacity exceeded !"); + } + } + } + + static float[] createArray(final int length, final boolean clean) { + if (clean) { + return new float[length]; + } + // use JDK9 Unsafe.allocateUninitializedArray(class, length): + return (float[]) OffHeapArray.UNSAFE.allocateUninitializedArray(float.class, length); } static void fill(final float[] array, final int fromIndex, final int toIndex, final float value) { // clear array data: - /* - * Arrays.fill is faster than System.arraycopy(empty array) - * or Unsafe.setMemory(byte 0) - */ - if (toIndex != 0) { - Arrays.fill(array, fromIndex, toIndex, value); - } - + Arrays.fill(array, fromIndex, toIndex, value); if (DO_CHECKS) { check(array, fromIndex, toIndex, value); } @@ -150,4 +264,8 @@ final class FloatArrayCache implements MarlinConst { } } } + + static String getLogPrefix(final boolean clean) { + return (clean) ? "Clean" : "Dirty"; + } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java index 917e9928137..b6699acf196 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java @@ -22,109 +22,224 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package sun.java2d.marlin; -import java.util.ArrayDeque; -import java.util.Arrays; -import static sun.java2d.marlin.MarlinUtils.logException; +import static sun.java2d.marlin.ArrayCacheConst.ARRAY_SIZES; +import static sun.java2d.marlin.ArrayCacheConst.BUCKETS; +import static sun.java2d.marlin.ArrayCacheConst.MAX_ARRAY_SIZE; import static sun.java2d.marlin.MarlinUtils.logInfo; +import static sun.java2d.marlin.MarlinUtils.logException; + +import java.lang.ref.WeakReference; +import java.util.Arrays; + +import sun.java2d.marlin.ArrayCacheConst.BucketStats; +import sun.java2d.marlin.ArrayCacheConst.CacheStats; + +/* + * Note that the [BYTE/INT/FLOAT]ArrayCache files are nearly identical except + * for a few type and name differences. Typically, the [BYTE]ArrayCache.java file + * is edited manually and then [INT]ArrayCache.java and [FLOAT]ArrayCache.java + * files are generated with the following command lines: + */ +// % sed -e 's/(b\yte)[ ]*//g' -e 's/b\yte/int/g' -e 's/B\yte/Int/g' < B\yteArrayCache.java > IntArrayCache.java +// % sed -e 's/(b\yte)[ ]*/(float) /g' -e 's/b\yte/float/g' -e 's/B\yte/Float/g' < B\yteArrayCache.java > FloatArrayCache.java final class IntArrayCache implements MarlinConst { - private final int arraySize; - private final ArrayDeque intArrays; - // stats - private int getOp = 0; - private int createOp = 0; - private int returnOp = 0; + final boolean clean; + private final int bucketCapacity; + private WeakReference refBuckets = null; + final CacheStats stats; - void dumpStats() { - if (getOp > 0) { - logInfo("IntArrayCache[" + arraySize + "]: get: " + getOp - + " created: " + createOp + " - returned: " + returnOp - + " :: cache size: " + intArrays.size()); - } + IntArrayCache(final boolean clean, final int bucketCapacity) { + this.clean = clean; + this.bucketCapacity = bucketCapacity; + this.stats = (DO_STATS) ? + new CacheStats(getLogPrefix(clean) + "IntArrayCache") : null; } - IntArrayCache(final int arraySize) { - this.arraySize = arraySize; - // small but enough: almost 1 cache line - this.intArrays = new ArrayDeque(6); + Bucket getCacheBucket(final int length) { + final int bucket = ArrayCacheConst.getBucket(length); + return getBuckets()[bucket]; } - int[] getArray() { - if (DO_STATS) { - getOp++; - } + private Bucket[] getBuckets() { + // resolve reference: + Bucket[] buckets = (refBuckets != null) ? refBuckets.get() : null; - // use cache: - final int[] array = intArrays.pollLast(); - if (array != null) { - return array; - } + // create a new buckets ? + if (buckets == null) { + buckets = new Bucket[BUCKETS]; - if (DO_STATS) { - createOp++; - } - - return new int[arraySize]; - } - - void putDirtyArray(final int[] array, final int length) { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + for (int i = 0; i < BUCKETS; i++) { + buckets[i] = new Bucket(clean, ARRAY_SIZES[i], bucketCapacity, + (DO_STATS) ? stats.bucketStats[i] : null); } - return; - } - if (DO_STATS) { - returnOp++; - } - // NO clean-up of array data = DIRTY ARRAY - - if (DO_CLEAN_DIRTY) { - // Force zero-fill dirty arrays: - Arrays.fill(array, 0, array.length, 0); + // update weak reference: + refBuckets = new WeakReference(buckets); } - - // fill cache: - intArrays.addLast(array); + return buckets; } - void putArray(final int[] array, final int length, - final int fromIndex, final int toIndex) - { - if (length != arraySize) { - if (DO_CHECKS) { - MarlinUtils.logInfo("ArrayCache: bad length = " + length); + Reference createRef(final int initialSize) { + return new Reference(this, initialSize); + } + + static final class Reference { + + // initial array reference (direct access) + final int[] initial; + private final boolean clean; + private final IntArrayCache cache; + + Reference(final IntArrayCache cache, final int initialSize) { + this.cache = cache; + this.clean = cache.clean; + this.initial = createArray(initialSize, clean); + if (DO_STATS) { + cache.stats.totalInitial += initialSize; } - return; - } - if (DO_STATS) { - returnOp++; } - // clean-up array of dirty part[fromIndex; toIndex[ - fill(array, fromIndex, toIndex, 0); + int[] getArray(final int length) { + if (length <= MAX_ARRAY_SIZE) { + return cache.getCacheBucket(length).getArray(); + } + if (DO_STATS) { + cache.stats.oversize++; + } + if (DO_LOG_OVERSIZE) { + logInfo(getLogPrefix(clean) + "IntArrayCache: " + + "getArray[oversize]: length=\t" + length); + } + return createArray(length, clean); + } - // fill cache: - intArrays.addLast(array); + int[] widenArray(final int[] array, final int usedSize, + final int needSize) + { + final int length = array.length; + if (DO_CHECKS && length >= needSize) { + return array; + } + if (DO_STATS) { + cache.stats.resize++; + } + + // maybe change bucket: + // ensure getNewSize() > newSize: + final int[] res = getArray(ArrayCacheConst.getNewSize(usedSize, needSize)); + + // use wrapper to ensure proper copy: + System.arraycopy(array, 0, res, 0, usedSize); // copy only used elements + + // maybe return current array: + putArray(array, 0, usedSize); // ensure array is cleared + + if (DO_LOG_WIDEN_ARRAY) { + logInfo(getLogPrefix(clean) + "IntArrayCache: " + + "widenArray[" + res.length + + "]: usedSize=\t" + usedSize + "\tlength=\t" + length + + "\tneeded length=\t" + needSize); + } + return res; + } + + int[] putArray(final int[] array) + { + // dirty array helper: + return putArray(array, 0, array.length); + } + + int[] putArray(final int[] array, final int fromIndex, + final int toIndex) + { + if (array.length <= MAX_ARRAY_SIZE) { + if ((clean || DO_CLEAN_DIRTY) && (toIndex != 0)) { + // clean-up array of dirty part[fromIndex; toIndex[ + fill(array, fromIndex, toIndex, 0); + } + // ensure to never store initial arrays in cache: + if (array != initial) { + cache.getCacheBucket(array.length).putArray(array); + } + } + return initial; + } + } + + static final class Bucket { + + private int tail = 0; + private final int arraySize; + private final boolean clean; + private final int[][] arrays; + private final BucketStats stats; + + Bucket(final boolean clean, final int arraySize, + final int capacity, final BucketStats stats) + { + this.arraySize = arraySize; + this.clean = clean; + this.stats = stats; + this.arrays = new int[capacity][]; + } + + int[] getArray() { + if (DO_STATS) { + stats.getOp++; + } + // use cache: + if (tail != 0) { + final int[] array = arrays[--tail]; + arrays[tail] = null; + return array; + } + if (DO_STATS) { + stats.createOp++; + } + return createArray(arraySize, clean); + } + + void putArray(final int[] array) + { + if (DO_CHECKS && (array.length != arraySize)) { + logInfo(getLogPrefix(clean) + "IntArrayCache: " + + "bad length = " + array.length); + return; + } + if (DO_STATS) { + stats.returnOp++; + } + // fill cache: + if (arrays.length > tail) { + arrays[tail++] = array; + + if (DO_STATS) { + stats.updateMaxSize(tail); + } + } else if (DO_CHECKS) { + logInfo(getLogPrefix(clean) + "IntArrayCache: " + + "array capacity exceeded !"); + } + } + } + + static int[] createArray(final int length, final boolean clean) { + if (clean) { + return new int[length]; + } + // use JDK9 Unsafe.allocateUninitializedArray(class, length): + return (int[]) OffHeapArray.UNSAFE.allocateUninitializedArray(int.class, length); } static void fill(final int[] array, final int fromIndex, final int toIndex, final int value) { // clear array data: - /* - * Arrays.fill is faster than System.arraycopy(empty array) - * or Unsafe.setMemory(byte 0) - */ - if (toIndex != 0) { - Arrays.fill(array, fromIndex, toIndex, value); - } - + Arrays.fill(array, fromIndex, toIndex, value); if (DO_CHECKS) { check(array, fromIndex, toIndex, value); } @@ -149,4 +264,8 @@ final class IntArrayCache implements MarlinConst { } } } + + static String getLogPrefix(final boolean clean) { + return (clean) ? "Clean" : "Dirty"; + } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java index 043b74ecd6b..a66f6808aa8 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java @@ -100,8 +100,8 @@ public final class MarlinCache implements MarlinConst { // per-thread renderer context final RendererContext rdrCtx; - // large cached touchedTile (dirty) - final int[] touchedTile_initial = new int[INITIAL_ARRAY]; // 1 tile line + // touchedTile ref (clean) + private final IntArrayCache.Reference touchedTile_ref; int tileMin, tileMax; @@ -110,9 +110,10 @@ public final class MarlinCache implements MarlinConst { MarlinCache(final RendererContext rdrCtx) { this.rdrCtx = rdrCtx; - rowAAChunk = new OffHeapArray(rdrCtx.cleanerObj, INITIAL_CHUNK_ARRAY); // 64K + rowAAChunk = rdrCtx.newOffHeapArray(INITIAL_CHUNK_ARRAY); // 64K - touchedTile = touchedTile_initial; + touchedTile_ref = rdrCtx.newCleanIntArrayRef(INITIAL_ARRAY); // 1K = 1 tile line + touchedTile = touchedTile_ref.initial; // tile used marks: tileMin = Integer.MAX_VALUE; @@ -181,10 +182,9 @@ public final class MarlinCache implements MarlinConst { if (nxTiles > INITIAL_ARRAY) { if (DO_STATS) { - rdrCtx.stats.stat_array_marlincache_touchedTile - .add(nxTiles); + rdrCtx.stats.stat_array_marlincache_touchedTile.add(nxTiles); } - touchedTile = rdrCtx.getIntArray(nxTiles); + touchedTile = touchedTile_ref.getArray(nxTiles); } } @@ -196,11 +196,13 @@ public final class MarlinCache implements MarlinConst { // Reset touchedTile if needed: resetTileLine(0); - // Return arrays: - if (touchedTile != touchedTile_initial) { - rdrCtx.putIntArray(touchedTile, 0, 0); // already zero filled - touchedTile = touchedTile_initial; + if (DO_STATS) { + rdrCtx.stats.totalOffHeap += rowAAChunk.length; } + + // Return arrays: + touchedTile = touchedTile_ref.putArray(touchedTile, 0, 0); // already zero filled + // At last: resize back off-heap rowAA to initial size if (rowAAChunk.length != INITIAL_CHUNK_ARRAY) { // note: may throw OOME: @@ -554,8 +556,7 @@ public final class MarlinCache implements MarlinConst { addr_off += SIZE_INT; if (DO_STATS) { - rdrCtx.stats.hist_tile_generator_encoding_runLen - .add(runLen); + rdrCtx.stats.hist_tile_generator_encoding_runLen.add(runLen); } long len = (addr_off - _rowAAChunk.address); @@ -612,12 +613,12 @@ public final class MarlinCache implements MarlinConst { private void expandRowAAChunk(final long needSize) { if (DO_STATS) { - rdrCtx.stats.stat_array_marlincache_rowAAChunk - .add(needSize); + rdrCtx.stats.stat_array_marlincache_rowAAChunk.add(needSize); } // note: throw IOOB if neededSize > 2Gb: - final long newSize = ArrayCache.getNewLargeSize(rowAAChunk.length, needSize); + final long newSize = ArrayCacheConst.getNewLargeSize(rowAAChunk.length, + needSize); rowAAChunk.resize(newSize); } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java index 22bf86d66c0..334989106bb 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinConst.java @@ -62,6 +62,8 @@ interface MarlinConst { // enable traces static final boolean DO_TRACE = ENABLE_LOGS && false; + // do flush stats + static final boolean DO_FLUSH_STATS = true; // do flush monitors static final boolean DO_FLUSH_MONITORS = true; // use one polling thread to dump statistics/monitors @@ -78,7 +80,7 @@ interface MarlinConst { // flag to enable logs related bounds checks static final boolean DO_LOG_BOUNDS = ENABLE_LOGS && false; - // Initial Array sizing (initial context capacity) ~ 350K + // Initial Array sizing (initial context capacity) ~ 450K // 2048 pixel (width x height) for initial capacity static final int INITIAL_PIXEL_DIM @@ -86,14 +88,17 @@ interface MarlinConst { // typical array sizes: only odd numbers allowed below static final int INITIAL_ARRAY = 256; - static final int INITIAL_SMALL_ARRAY = 1024; - static final int INITIAL_MEDIUM_ARRAY = 4096; - static final int INITIAL_LARGE_ARRAY = 8192; + // alpha row dimension static final int INITIAL_AA_ARRAY = INITIAL_PIXEL_DIM; - // initial edges (24 bytes) = 24K [ints] = 96K - static final int INITIAL_EDGES_CAPACITY = 4096 * 24; // 6 ints per edges + // 4096 edges for initial capacity + static final int INITIAL_EDGES_COUNT = MarlinProperties.getInitialEdges(); + + // initial edges = 3/4 * edges count (4096) + // 6 ints per edges = 24 bytes + // edges capacity = 24 x initial edges = 18 * edges count (4096) = 72K + static final int INITIAL_EDGES_CAPACITY = INITIAL_EDGES_COUNT * 18; // zero value as byte static final byte BYTE_0 = (byte) 0; diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java index bbee15a13fb..2cf5d65bcd0 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinProperties.java @@ -41,6 +41,18 @@ public final class MarlinProperties { return getBoolean("sun.java2d.renderer.useThreadLocal", "true"); } + /** + * Return the initial edge capacity used to define initial arrays + * (edges, polystack, crossings) + * + * @return 256 < initial edges < 65536 (4096 by default) + */ + public static int getInitialEdges() { + return align( + getInteger("sun.java2d.renderer.edges", 4096, 64, 64 * 1024), + 64); + } + /** * Return the initial pixel size used to define initial arrays * (tile AA chunk, alpha line, buckets) @@ -48,7 +60,9 @@ public final class MarlinProperties { * @return 64 < initial pixel size < 32768 (2048 by default) */ public static int getInitialImageSize() { - return getInteger("sun.java2d.renderer.pixelsize", 2048, 64, 32 * 1024); + return align( + getInteger("sun.java2d.renderer.pixelsize", 2048, 64, 32 * 1024), + 64); } /** @@ -182,4 +196,8 @@ public final class MarlinProperties { return value; } + static int align(final int val, final int norm) { + final int ceil = FloatMath.ceil_int( ((float)val) / norm); + return ceil * norm; + } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java index b7d3af4159d..a3bddaa39b0 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java @@ -47,7 +47,38 @@ import sun.security.action.GetPropertyAction; public class MarlinRenderingEngine extends RenderingEngine implements MarlinConst { - private static enum NormMode {ON_WITH_AA, ON_NO_AA, OFF} + private static enum NormMode { + ON_WITH_AA { + @Override + PathIterator getNormalizingPathIterator(final RendererContext rdrCtx, + final PathIterator src) + { + // NormalizingPathIterator NearestPixelCenter: + return rdrCtx.nPCPathIterator.init(src); + } + }, + ON_NO_AA{ + @Override + PathIterator getNormalizingPathIterator(final RendererContext rdrCtx, + final PathIterator src) + { + // NearestPixel NormalizingPathIterator: + return rdrCtx.nPQPathIterator.init(src); + } + }, + OFF{ + @Override + PathIterator getNormalizingPathIterator(final RendererContext rdrCtx, + final PathIterator src) + { + // return original path iterator if normalization is disabled: + return src; + } + }; + + abstract PathIterator getNormalizingPathIterator(RendererContext rdrCtx, + PathIterator src); + } private static final float MIN_PEN_SIZE = 1f / NORM_SUBPIXELS; @@ -91,13 +122,7 @@ public class MarlinRenderingEngine extends RenderingEngine final RendererContext rdrCtx = getRendererContext(); try { // initialize a large copyable Path2D to avoid a lot of array growing: - final Path2D.Float p2d = - (rdrCtx.p2d == null) ? - (rdrCtx.p2d = new Path2D.Float(Path2D.WIND_NON_ZERO, - INITIAL_MEDIUM_ARRAY)) - : rdrCtx.p2d; - // reset - p2d.reset(); + final Path2D.Float p2d = rdrCtx.getPath2D(); strokeTo(rdrCtx, src, @@ -274,7 +299,7 @@ public class MarlinRenderingEngine extends RenderingEngine Shape src, AffineTransform at, float width, - NormMode normalize, + NormMode norm, int caps, int join, float miterlimit, @@ -338,13 +363,12 @@ public class MarlinRenderingEngine extends RenderingEngine dashLen = dashes.length; final float[] newDashes; if (dashLen <= INITIAL_ARRAY) { - newDashes = rdrCtx.dasher.dashes_initial; + newDashes = rdrCtx.dasher.dashes_ref.initial; } else { if (DO_STATS) { - rdrCtx.stats.stat_array_dasher_dasher - .add(dashLen); + rdrCtx.stats.stat_array_dasher_dasher.add(dashLen); } - newDashes = rdrCtx.getDirtyFloatArray(dashLen); + newDashes = rdrCtx.dasher.dashes_ref.getArray(dashLen); } System.arraycopy(dashes, 0, newDashes, 0, dashLen); dashes = newDashes; @@ -400,8 +424,8 @@ public class MarlinRenderingEngine extends RenderingEngine } pc2d = transformerPC2D.inverseDeltaTransformConsumer(pc2d, strokerat); - final PathIterator pi = getNormalizingPathIterator(rdrCtx, normalize, - src.getPathIterator(at)); + final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx, + src.getPathIterator(at)); pathTo(rdrCtx, pi, pc2d); @@ -424,25 +448,6 @@ public class MarlinRenderingEngine extends RenderingEngine return Math.abs(num) < 2.0 * Math.ulp(num); } - PathIterator getNormalizingPathIterator(final RendererContext rdrCtx, - final NormMode mode, - final PathIterator src) - { - switch (mode) { - case ON_WITH_AA: - // NormalizingPathIterator NearestPixelCenter: - return rdrCtx.nPCPathIterator.init(src); - case ON_NO_AA: - // NearestPixel NormalizingPathIterator: - return rdrCtx.nPQPathIterator.init(src); - case OFF: - // return original path iterator if normalization is disabled: - return src; - default: - throw new InternalError("Unrecognized normalization mode"); - } - } - abstract static class NormalizingPathIterator implements PathIterator { private PathIterator src; @@ -792,8 +797,8 @@ public class MarlinRenderingEngine extends RenderingEngine if (bs == null) { // fill shape: - final PathIterator pi = getNormalizingPathIterator(rdrCtx, norm, - s.getPathIterator(_at)); + final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx, + s.getPathIterator(_at)); // note: Winding rule may be EvenOdd ONLY for fill operations ! r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(), @@ -1021,8 +1026,11 @@ public class MarlinRenderingEngine extends RenderingEngine logInfo("sun.java2d.renderer.useRef = " + refType); + logInfo("sun.java2d.renderer.edges = " + + MarlinConst.INITIAL_EDGES_COUNT); logInfo("sun.java2d.renderer.pixelsize = " + MarlinConst.INITIAL_PIXEL_DIM); + logInfo("sun.java2d.renderer.subPixel_log2_X = " + MarlinConst.SUBPIXEL_LG_POSITIONS_X); logInfo("sun.java2d.renderer.subPixel_log2_Y = " @@ -1076,6 +1084,11 @@ public class MarlinRenderingEngine extends RenderingEngine logInfo("CUB_INC_BND = " + Renderer.CUB_INC_BND); logInfo("QUAD_DEC_BND = " + Renderer.QUAD_DEC_BND); + logInfo("INITIAL_EDGES_CAPACITY = " + + MarlinConst.INITIAL_EDGES_CAPACITY); + logInfo("INITIAL_CROSSING_COUNT = " + + Renderer.INITIAL_CROSSING_COUNT); + logInfo("==========================================================" + "====================="); } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java index ec499a9ff29..d3b058b59b1 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java @@ -43,9 +43,9 @@ final class Renderer implements PathConsumer2D, MarlinConst { private static final double POWER_2_TO_32 = 0x1.0p32; // use float to make tosubpix methods faster (no int to float conversion) - public static final float f_SUBPIXEL_POSITIONS_X + public static final float F_SUBPIXEL_POSITIONS_X = (float) SUBPIXEL_POSITIONS_X; - public static final float f_SUBPIXEL_POSITIONS_Y + public static final float F_SUBPIXEL_POSITIONS_Y = (float) SUBPIXEL_POSITIONS_Y; public static final int SUBPIXEL_MASK_X = SUBPIXEL_POSITIONS_X - 1; public static final int SUBPIXEL_MASK_Y = SUBPIXEL_POSITIONS_Y - 1; @@ -58,6 +58,9 @@ final class Renderer implements PathConsumer2D, MarlinConst { static final int INITIAL_BUCKET_ARRAY = INITIAL_PIXEL_DIM * SUBPIXEL_POSITIONS_Y; + // crossing capacity = edges count / 8 ~ 512 + static final int INITIAL_CROSSING_COUNT = INITIAL_EDGES_COUNT >> 3; + public static final int WIND_EVEN_ODD = 0; public static final int WIND_NON_ZERO = 1; @@ -136,14 +139,15 @@ final class Renderer implements PathConsumer2D, MarlinConst { // max used for both edgePtrs and crossings (stats only) private int activeEdgeMaxUsed; - // per-thread initial arrays (large enough to satisfy most usages) (1024) - private final int[] crossings_initial = new int[INITIAL_SMALL_ARRAY]; // 4K - // +1 to avoid recycling in Helpers.widenArray() - private final int[] edgePtrs_initial = new int[INITIAL_SMALL_ARRAY + 1]; // 4K + // crossings ref (dirty) + private final IntArrayCache.Reference crossings_ref; + // edgePtrs ref (dirty) + private final IntArrayCache.Reference edgePtrs_ref; // merge sort initial arrays (large enough to satisfy most usages) (1024) - private final int[] aux_crossings_initial = new int[INITIAL_SMALL_ARRAY]; // 4K - // +1 to avoid recycling in Helpers.widenArray() - private final int[] aux_edgePtrs_initial = new int[INITIAL_SMALL_ARRAY + 1]; // 4K + // aux_crossings ref (dirty) + private final IntArrayCache.Reference aux_crossings_ref; + // aux_edgePtrs ref (dirty) + private final IntArrayCache.Reference aux_edgePtrs_ref; ////////////////////////////////////////////////////////////////////////////// // EDGE LIST @@ -164,11 +168,10 @@ final class Renderer implements PathConsumer2D, MarlinConst { // sum of each edge delta Y (subpixels) private int edgeSumDeltaY; - // +1 to avoid recycling in Helpers.widenArray() - private final int[] edgeBuckets_initial - = new int[INITIAL_BUCKET_ARRAY + 1]; // 64K - private final int[] edgeBucketCounts_initial - = new int[INITIAL_BUCKET_ARRAY + 1]; // 64K + // edgeBuckets ref (clean) + private final IntArrayCache.Reference edgeBuckets_ref; + // edgeBucketCounts ref (clean) + private final IntArrayCache.Reference edgeBucketCounts_ref; // Flattens using adaptive forward differencing. This only carries out // one iteration of the AFD loop. All it does is update AFD variables (i.e. @@ -402,7 +405,8 @@ final class Renderer implements PathConsumer2D, MarlinConst { // suppose _edges.length > _SIZEOF_EDGE_BYTES // so doubling size is enough to add needed bytes // note: throw IOOB if neededSize > 2Gb: - final long edgeNewSize = ArrayCache.getNewLargeSize(_edges.length, + final long edgeNewSize = ArrayCacheConst.getNewLargeSize( + _edges.length, edgePtr + _SIZEOF_EDGE_BYTES); if (DO_STATS) { @@ -514,28 +518,52 @@ final class Renderer implements PathConsumer2D, MarlinConst { // dirty curve private final Curve curve; + // clean alpha array (zero filled) + private int[] alphaLine; + + // alphaLine ref (clean) + private final IntArrayCache.Reference alphaLine_ref; + + private boolean enableBlkFlags = false; + private boolean prevUseBlkFlags = false; + + /* block flags (0|1) */ + private int[] blkFlags; + + // blkFlags ref (clean) + private final IntArrayCache.Reference blkFlags_ref; + Renderer(final RendererContext rdrCtx) { this.rdrCtx = rdrCtx; - this.edges = new OffHeapArray(rdrCtx.cleanerObj, INITIAL_EDGES_CAPACITY); // 96K + this.edges = rdrCtx.newOffHeapArray(INITIAL_EDGES_CAPACITY); // 96K this.curve = rdrCtx.curve; - edgeBuckets = edgeBuckets_initial; - edgeBucketCounts = edgeBucketCounts_initial; + edgeBuckets_ref = rdrCtx.newCleanIntArrayRef(INITIAL_BUCKET_ARRAY); // 64K + edgeBucketCounts_ref = rdrCtx.newCleanIntArrayRef(INITIAL_BUCKET_ARRAY); // 64K - alphaLine = alphaLine_initial; + edgeBuckets = edgeBuckets_ref.initial; + edgeBucketCounts = edgeBucketCounts_ref.initial; + + // 2048 (pixelsize) pixel large + alphaLine_ref = rdrCtx.newCleanIntArrayRef(INITIAL_AA_ARRAY); // 8K + alphaLine = alphaLine_ref.initial; this.cache = rdrCtx.cache; - // ScanLine: - crossings = crossings_initial; - aux_crossings = aux_crossings_initial; - edgePtrs = edgePtrs_initial; - aux_edgePtrs = aux_edgePtrs_initial; + crossings_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K + aux_crossings_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K + edgePtrs_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K + aux_edgePtrs_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K - edgeCount = 0; - activeEdgeMaxUsed = 0; + crossings = crossings_ref.initial; + aux_crossings = aux_crossings_ref.initial; + edgePtrs = edgePtrs_ref.initial; + aux_edgePtrs = aux_edgePtrs_ref.initial; + + blkFlags_ref = rdrCtx.newCleanIntArrayRef(INITIAL_ARRAY); // 1K = 1 tile line + blkFlags = blkFlags_ref.initial; } Renderer init(final int pix_boundsX, final int pix_boundsY, @@ -569,8 +597,8 @@ final class Renderer implements PathConsumer2D, MarlinConst { rdrCtx.stats.stat_array_renderer_edgeBucketCounts .add(edgeBucketsLength); } - edgeBuckets = rdrCtx.getIntArray(edgeBucketsLength); - edgeBucketCounts = rdrCtx.getIntArray(edgeBucketsLength); + edgeBuckets = edgeBuckets_ref.getArray(edgeBucketsLength); + edgeBucketCounts = edgeBucketCounts_ref.getArray(edgeBucketsLength); } edgeMinY = Integer.MAX_VALUE; @@ -595,41 +623,19 @@ final class Renderer implements PathConsumer2D, MarlinConst { if (DO_STATS) { rdrCtx.stats.stat_rdr_activeEdges.add(activeEdgeMaxUsed); rdrCtx.stats.stat_rdr_edges.add(edges.used); - rdrCtx.stats.stat_rdr_edges_count - .add(edges.used / SIZEOF_EDGE_BYTES); - } - if (DO_CLEAN_DIRTY) { - // Force zero-fill dirty arrays: - Arrays.fill(crossings, 0); - Arrays.fill(aux_crossings, 0); - Arrays.fill(edgePtrs, 0); - Arrays.fill(aux_edgePtrs, 0); + rdrCtx.stats.stat_rdr_edges_count.add(edges.used / SIZEOF_EDGE_BYTES); + rdrCtx.stats.hist_rdr_edges_count.add(edges.used / SIZEOF_EDGE_BYTES); + rdrCtx.stats.totalOffHeap += edges.length; } // Return arrays: - if (crossings != crossings_initial) { - rdrCtx.putDirtyIntArray(crossings); - crossings = crossings_initial; - if (aux_crossings != aux_crossings_initial) { - rdrCtx.putDirtyIntArray(aux_crossings); - aux_crossings = aux_crossings_initial; - } - } - if (edgePtrs != edgePtrs_initial) { - rdrCtx.putDirtyIntArray(edgePtrs); - edgePtrs = edgePtrs_initial; - if (aux_edgePtrs != aux_edgePtrs_initial) { - rdrCtx.putDirtyIntArray(aux_edgePtrs); - aux_edgePtrs = aux_edgePtrs_initial; - } - } - if (alphaLine != alphaLine_initial) { - rdrCtx.putIntArray(alphaLine, 0, 0); // already zero filled - alphaLine = alphaLine_initial; - } - if (blkFlags != blkFlags_initial) { - rdrCtx.putIntArray(blkFlags, 0, 0); // already zero filled - blkFlags = blkFlags_initial; - } + crossings = crossings_ref.putArray(crossings); + aux_crossings = aux_crossings_ref.putArray(aux_crossings); + + edgePtrs = edgePtrs_ref.putArray(edgePtrs); + aux_edgePtrs = aux_edgePtrs_ref.putArray(aux_edgePtrs); + + alphaLine = alphaLine_ref.putArray(alphaLine, 0, 0); // already zero filled + blkFlags = blkFlags_ref.putArray(blkFlags, 0, 0); // already zero filled if (edgeMinY != Integer.MAX_VALUE) { // if context is maked as DIRTY: @@ -639,30 +645,16 @@ final class Renderer implements PathConsumer2D, MarlinConst { buckets_minY = 0; buckets_maxY = boundsMaxY - boundsMinY; } - // clear used part - if (edgeBuckets == edgeBuckets_initial) { - // fill only used part - IntArrayCache.fill(edgeBuckets, buckets_minY, - buckets_maxY, 0); - IntArrayCache.fill(edgeBucketCounts, buckets_minY, - buckets_maxY + 1, 0); - } else { - // clear only used part - rdrCtx.putIntArray(edgeBuckets, buckets_minY, - buckets_maxY); - edgeBuckets = edgeBuckets_initial; - - rdrCtx.putIntArray(edgeBucketCounts, buckets_minY, - buckets_maxY + 1); - edgeBucketCounts = edgeBucketCounts_initial; - } - } else if (edgeBuckets != edgeBuckets_initial) { + // clear only used part + edgeBuckets = edgeBuckets_ref.putArray(edgeBuckets, buckets_minY, + buckets_maxY); + edgeBucketCounts = edgeBucketCounts_ref.putArray(edgeBucketCounts, + buckets_minY, + buckets_maxY + 1); + } else { // unused arrays - rdrCtx.putIntArray(edgeBuckets, 0, 0); - edgeBuckets = edgeBuckets_initial; - - rdrCtx.putIntArray(edgeBucketCounts, 0, 0); - edgeBucketCounts = edgeBucketCounts_initial; + edgeBuckets = edgeBuckets_ref.putArray(edgeBuckets, 0, 0); + edgeBucketCounts = edgeBucketCounts_ref.putArray(edgeBucketCounts, 0, 0); } // At last: resize back off-heap edges to initial size @@ -680,12 +672,12 @@ final class Renderer implements PathConsumer2D, MarlinConst { } private static float tosubpixx(final float pix_x) { - return f_SUBPIXEL_POSITIONS_X * pix_x; + return F_SUBPIXEL_POSITIONS_X * pix_x; } private static float tosubpixy(final float pix_y) { // shift y by -0.5 for fast ceil(y - 0.5): - return f_SUBPIXEL_POSITIONS_Y * pix_y - 0.5f; + return F_SUBPIXEL_POSITIONS_Y * pix_y - 0.5f; } @Override @@ -749,11 +741,6 @@ final class Renderer implements PathConsumer2D, MarlinConst { throw new InternalError("Renderer does not use a native consumer."); } - // clean alpha array (zero filled) - private int[] alphaLine; - // 2048 (pixelsize) pixel large - private final int[] alphaLine_initial = new int[INITIAL_AA_ARRAY]; // 8K - private void _endRendering(final int ymin, final int ymax) { if (DISABLE_RENDER) { return; @@ -857,8 +844,7 @@ final class Renderer implements PathConsumer2D, MarlinConst { // bucketCount indicates new edge / edge end: if (bucketcount != 0) { if (DO_STATS) { - rdrCtx.stats.stat_rdr_activeEdges_updates - .add(numCrossings); + rdrCtx.stats.stat_rdr_activeEdges_updates.add(numCrossings); } // last bit set to 1 means that edges ends @@ -883,38 +869,33 @@ final class Renderer implements PathConsumer2D, MarlinConst { if (ptrLen != 0) { if (DO_STATS) { - rdrCtx.stats.stat_rdr_activeEdges_adds - .add(ptrLen); + rdrCtx.stats.stat_rdr_activeEdges_adds.add(ptrLen); if (ptrLen > 10) { - rdrCtx.stats.stat_rdr_activeEdges_adds_high - .add(ptrLen); + rdrCtx.stats.stat_rdr_activeEdges_adds_high.add(ptrLen); } } ptrEnd = numCrossings + ptrLen; if (edgePtrsLen < ptrEnd) { if (DO_STATS) { - rdrCtx.stats.stat_array_renderer_edgePtrs - .add(ptrEnd); + rdrCtx.stats.stat_array_renderer_edgePtrs.add(ptrEnd); } this.edgePtrs = _edgePtrs - = rdrCtx.widenDirtyIntArray(_edgePtrs, numCrossings, - ptrEnd); + = edgePtrs_ref.widenArray(_edgePtrs, numCrossings, + ptrEnd); edgePtrsLen = _edgePtrs.length; // Get larger auxiliary storage: - if (_aux_edgePtrs != aux_edgePtrs_initial) { - rdrCtx.putDirtyIntArray(_aux_edgePtrs); - } + aux_edgePtrs_ref.putArray(_aux_edgePtrs); + // use ArrayCache.getNewSize() to use the same growing - // factor than widenDirtyIntArray(): + // factor than widenArray(): if (DO_STATS) { - rdrCtx.stats.stat_array_renderer_aux_edgePtrs - .add(ptrEnd); + rdrCtx.stats.stat_array_renderer_aux_edgePtrs.add(ptrEnd); } this.aux_edgePtrs = _aux_edgePtrs - = rdrCtx.getDirtyIntArray( - ArrayCache.getNewSize(numCrossings, ptrEnd) + = aux_edgePtrs_ref.getArray( + ArrayCacheConst.getNewSize(numCrossings, ptrEnd) ); } @@ -933,26 +914,24 @@ final class Renderer implements PathConsumer2D, MarlinConst { if (crossingsLen < numCrossings) { // Get larger array: - if (_crossings != crossings_initial) { - rdrCtx.putDirtyIntArray(_crossings); - } + crossings_ref.putArray(_crossings); + if (DO_STATS) { rdrCtx.stats.stat_array_renderer_crossings .add(numCrossings); } this.crossings = _crossings - = rdrCtx.getDirtyIntArray(numCrossings); + = crossings_ref.getArray(numCrossings); // Get larger auxiliary storage: - if (_aux_crossings != aux_crossings_initial) { - rdrCtx.putDirtyIntArray(_aux_crossings); - } + aux_crossings_ref.putArray(_aux_crossings); + if (DO_STATS) { rdrCtx.stats.stat_array_renderer_aux_crossings .add(numCrossings); } this.aux_crossings = _aux_crossings - = rdrCtx.getDirtyIntArray(numCrossings); + = aux_crossings_ref.getArray(numCrossings); crossingsLen = _crossings.length; } @@ -973,10 +952,8 @@ final class Renderer implements PathConsumer2D, MarlinConst { */ if ((ptrLen < 10) || (numCrossings < 40)) { if (DO_STATS) { - rdrCtx.stats.hist_rdr_crossings - .add(numCrossings); - rdrCtx.stats.hist_rdr_crossings_adds - .add(ptrLen); + rdrCtx.stats.hist_rdr_crossings.add(numCrossings); + rdrCtx.stats.hist_rdr_crossings_adds.add(ptrLen); } /* @@ -1019,23 +996,20 @@ final class Renderer implements PathConsumer2D, MarlinConst { _unsafe.putInt(addr + _OFF_ERROR, (err & _ERR_STEP_MAX)); if (DO_STATS) { - rdrCtx.stats.stat_rdr_crossings_updates - .add(numCrossings); + rdrCtx.stats.stat_rdr_crossings_updates.add(numCrossings); } // insertion sort of crossings: if (cross < lastCross) { if (DO_STATS) { - rdrCtx.stats.stat_rdr_crossings_sorts - .add(i); + rdrCtx.stats.stat_rdr_crossings_sorts.add(i); } /* use binary search for newly added edges in crossings if arrays are large enough */ if (useBinarySearch && (i >= prevNumCrossings)) { if (DO_STATS) { - rdrCtx.stats. - stat_rdr_crossings_bsearch.add(i); + rdrCtx.stats.stat_rdr_crossings_bsearch.add(i); } low = 0; high = i - 1; @@ -1078,14 +1052,11 @@ final class Renderer implements PathConsumer2D, MarlinConst { } } else { if (DO_STATS) { - rdrCtx.stats.stat_rdr_crossings_msorts - .add(numCrossings); + rdrCtx.stats.stat_rdr_crossings_msorts.add(numCrossings); rdrCtx.stats.hist_rdr_crossings_ratio .add((1000 * ptrLen) / numCrossings); - rdrCtx.stats.hist_rdr_crossings_msorts - .add(numCrossings); - rdrCtx.stats.hist_rdr_crossings_msorts_adds - .add(ptrLen); + rdrCtx.stats.hist_rdr_crossings_msorts.add(numCrossings); + rdrCtx.stats.hist_rdr_crossings_msorts_adds.add(ptrLen); } // Copy sorted data in auxiliary arrays @@ -1125,8 +1096,7 @@ final class Renderer implements PathConsumer2D, MarlinConst { _unsafe.putInt(addr + _OFF_ERROR, (err & _ERR_STEP_MAX)); if (DO_STATS) { - rdrCtx.stats.stat_rdr_crossings_updates - .add(numCrossings); + rdrCtx.stats.stat_rdr_crossings_updates.add(numCrossings); } if (i >= prevNumCrossings) { @@ -1136,8 +1106,7 @@ final class Renderer implements PathConsumer2D, MarlinConst { } else if (cross < lastCross) { if (DO_STATS) { - rdrCtx.stats.stat_rdr_crossings_sorts - .add(i); + rdrCtx.stats.stat_rdr_crossings_sorts.add(i); } // (straight) insertion sort of crossings: @@ -1462,7 +1431,7 @@ final class Renderer implements PathConsumer2D, MarlinConst { // note: +2 to ensure enough space left at end final int nxTiles = ((pmaxX - pminX) >> TILE_SIZE_LG) + 2; if (nxTiles > INITIAL_ARRAY) { - blkFlags = rdrCtx.getIntArray(nxTiles); + blkFlags = blkFlags_ref.getArray(nxTiles); } } } @@ -1494,10 +1463,9 @@ final class Renderer implements PathConsumer2D, MarlinConst { // Useful when processing tile line by tile line if (width > INITIAL_AA_ARRAY) { if (DO_STATS) { - rdrCtx.stats.stat_array_renderer_alphaline - .add(width); + rdrCtx.stats.stat_array_renderer_alphaline.add(width); } - alphaLine = rdrCtx.getIntArray(width); + alphaLine = alphaLine_ref.getArray(width); } // process first tile line: @@ -1532,13 +1500,6 @@ final class Renderer implements PathConsumer2D, MarlinConst { } } - private boolean enableBlkFlags = false; - private boolean prevUseBlkFlags = false; - - private final int[] blkFlags_initial = new int[INITIAL_ARRAY]; // 1 tile line - /* block flags (0|1) */ - private int[] blkFlags = blkFlags_initial; - void copyAARow(final int[] alphaRow, final int pix_y, final int pix_from, final int pix_to, final boolean useBlockFlags) diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java index a11a1e829d6..f6290cb8db3 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java @@ -29,10 +29,8 @@ import java.awt.geom.Path2D; import java.lang.ref.WeakReference; import java.util.concurrent.atomic.AtomicInteger; import sun.java2d.ReentrantContext; -import sun.java2d.ReentrantContextProvider; -import static sun.java2d.marlin.ArrayCache.*; +import sun.java2d.marlin.ArrayCacheConst.CacheStats; import sun.java2d.marlin.MarlinRenderingEngine.NormalizingPathIterator; -import static sun.java2d.marlin.MarlinUtils.logInfo; /** * This class is a renderer context dedicated to a single thread @@ -41,12 +39,6 @@ final class RendererContext extends ReentrantContext implements MarlinConst { // RendererContext creation counter private static final AtomicInteger CTX_COUNT = new AtomicInteger(1); - // RendererContext statistics - final RendererStats stats = (DO_STATS || DO_MONITORS) - ? RendererStats.getInstance(): null; - - private static final boolean USE_CACHE_HARD_REF = DO_STATS - || (MarlinRenderingEngine.REF_TYPE == ReentrantContextProvider.REF_WEAK); /** * Create a new renderer context @@ -54,25 +46,14 @@ final class RendererContext extends ReentrantContext implements MarlinConst { * @return new RendererContext instance */ static RendererContext createContext() { - final RendererContext newCtx = new RendererContext("ctx" - + Integer.toString(CTX_COUNT.getAndIncrement())); - - if (DO_STATS || DO_MONITORS) { - RendererStats.ALL_CONTEXTS.add(newCtx); - } - return newCtx; + return new RendererContext("ctx" + + Integer.toString(CTX_COUNT.getAndIncrement())); } - // context name (debugging purposes) - final String name; // Smallest object used as Cleaner's parent reference - final Object cleanerObj = new Object(); + private final Object cleanerObj; // dirty flag indicating an exception occured during pipeline in pathTo() boolean dirty = false; - // dynamic array caches kept using weak reference (low memory footprint) - WeakReference refArrayCaches = null; - // hard reference to array caches (for statistics) - ArrayCachesHolder hardRefArrayCaches = null; // shared data final float[] float6 = new float[6]; // shared curve (dirty) (Renderer / Stroker) @@ -83,8 +64,8 @@ final class RendererContext extends ReentrantContext implements MarlinConst { final NormalizingPathIterator nPQPathIterator; // MarlinRenderingEngine.TransformingPathConsumer2D final TransformingPathConsumer2D transformerPC2D; - // recycled Path2D instance - Path2D.Float p2d = null; + // recycled Path2D instance (weak) + private WeakReference refPath2D = null; final Renderer renderer; final Stroker stroker; // Simplifies out collinear lines @@ -95,6 +76,19 @@ final class RendererContext extends ReentrantContext implements MarlinConst { // flag indicating the shape is stroked (1) or filled (0) int stroking = 0; + // Array caches: + /* clean int[] cache (zero-filled) = 5 refs */ + private final IntArrayCache cleanIntCache = new IntArrayCache(true, 5); + /* dirty int[] cache = 4 refs */ + private final IntArrayCache dirtyIntCache = new IntArrayCache(false, 4); + /* dirty float[] cache = 3 refs */ + private final FloatArrayCache dirtyFloatCache = new FloatArrayCache(false, 3); + /* dirty byte[] cache = 1 ref */ + private final ByteArrayCache dirtyByteCache = new ByteArrayCache(false, 1); + + // RendererContext statistics + final RendererStats stats; + /** * Constructor * @@ -104,8 +98,18 @@ final class RendererContext extends ReentrantContext implements MarlinConst { if (LOG_CREATE_CONTEXT) { MarlinUtils.logInfo("new RendererContext = " + name); } + this.cleanerObj = new Object(); - this.name = name; + // create first stats (needed by newOffHeapArray): + if (DO_STATS || DO_MONITORS) { + stats = RendererStats.createInstance(cleanerObj, name); + // push cache stats: + stats.cacheStats = new CacheStats[] { cleanIntCache.stats, + dirtyIntCache.stats, dirtyFloatCache.stats, dirtyByteCache.stats + }; + } else { + stats = null; + } // NormalizingPathIterator instances: nPCPathIterator = new NormalizingPathIterator.NearestPixelCenter(float6); @@ -128,11 +132,13 @@ final class RendererContext extends ReentrantContext implements MarlinConst { * clean up before reusing this context */ void dispose() { - stroking = 0; - // reset hard reference to array caches if needed: - if (!USE_CACHE_HARD_REF) { - hardRefArrayCaches = null; + if (DO_STATS) { + if (stats.totalOffHeap > stats.totalOffHeapMax) { + stats.totalOffHeapMax = stats.totalOffHeap; + } + stats.totalOffHeap = 0L; } + stroking = 0; // if context is maked as DIRTY: if (dirty) { // may happen if an exception if thrown in the pipeline processing: @@ -151,300 +157,43 @@ final class RendererContext extends ReentrantContext implements MarlinConst { } } - // Array caches - ArrayCachesHolder getArrayCachesHolder() { - // Use hard reference first (cached resolved weak reference): - ArrayCachesHolder holder = hardRefArrayCaches; - if (holder == null) { - // resolve reference: - holder = (refArrayCaches != null) - ? refArrayCaches.get() - : null; - // create a new ArrayCachesHolder if none is available - if (holder == null) { - if (LOG_CREATE_CONTEXT) { - MarlinUtils.logInfo("new ArrayCachesHolder for " - + "RendererContext = " + name); - } + Path2D.Float getPath2D() { + // resolve reference: + Path2D.Float p2d + = (refPath2D != null) ? refPath2D.get() : null; - holder = new ArrayCachesHolder(); + // create a new Path2D ? + if (p2d == null) { + p2d = new Path2D.Float(Path2D.WIND_NON_ZERO, INITIAL_EDGES_COUNT); // 32K - if (USE_CACHE_HARD_REF) { - // update hard reference: - hardRefArrayCaches = holder; - } else { - // update weak reference: - refArrayCaches = new WeakReference(holder); - } - } + // update weak reference: + refPath2D = new WeakReference(p2d); } - return holder; + // reset the path anyway: + p2d.reset(); + return p2d; } - // dirty byte array cache - ByteArrayCache getDirtyByteArrayCache(final int length) { - final int bucket = ArrayCache.getBucketDirtyBytes(length); - return getArrayCachesHolder().dirtyByteArrayCaches[bucket]; - } - - byte[] getDirtyByteArray(final int length) { - if (length <= MAX_DIRTY_BYTE_ARRAY_SIZE) { - return getDirtyByteArrayCache(length).getArray(); - } - + OffHeapArray newOffHeapArray(final long initialSize) { if (DO_STATS) { - incOversize(); + stats.totalOffHeapInitial += initialSize; } - - if (DO_LOG_OVERSIZE) { - logInfo("getDirtyByteArray[oversize]: length=\t" + length); - } - - return new byte[length]; + return new OffHeapArray(cleanerObj, initialSize); } - void putDirtyByteArray(final byte[] array) { - final int length = array.length; - // odd sized array are non-cached arrays (initial arrays) - // ensure to never store initial arrays in cache: - if (((length & 0x1) == 0) && (length <= MAX_DIRTY_BYTE_ARRAY_SIZE)) { - getDirtyByteArrayCache(length).putDirtyArray(array, length); - } + IntArrayCache.Reference newCleanIntArrayRef(final int initialSize) { + return cleanIntCache.createRef(initialSize); } - byte[] widenDirtyByteArray(final byte[] in, - final int usedSize, final int needSize) - { - final int length = in.length; - if (DO_CHECKS && length >= needSize) { - return in; - } - if (DO_STATS) { - incResizeDirtyByte(); - } - - // maybe change bucket: - // ensure getNewSize() > newSize: - final byte[] res = getDirtyByteArray(getNewSize(usedSize, needSize)); - - System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements - - // maybe return current array: - // NO clean-up of array data = DIRTY ARRAY - putDirtyByteArray(in); - - if (DO_LOG_WIDEN_ARRAY) { - logInfo("widenDirtyByteArray[" + res.length + "]: usedSize=\t" - + usedSize + "\tlength=\t" + length + "\tneeded length=\t" - + needSize); - } - return res; + IntArrayCache.Reference newDirtyIntArrayRef(final int initialSize) { + return dirtyIntCache.createRef(initialSize); } - // int array cache - IntArrayCache getIntArrayCache(final int length) { - final int bucket = ArrayCache.getBucket(length); - return getArrayCachesHolder().intArrayCaches[bucket]; + FloatArrayCache.Reference newDirtyFloatArrayRef(final int initialSize) { + return dirtyFloatCache.createRef(initialSize); } - int[] getIntArray(final int length) { - if (length <= MAX_ARRAY_SIZE) { - return getIntArrayCache(length).getArray(); - } - - if (DO_STATS) { - incOversize(); - } - - if (DO_LOG_OVERSIZE) { - logInfo("getIntArray[oversize]: length=\t" + length); - } - - return new int[length]; - } - - // unused - int[] widenIntArray(final int[] in, final int usedSize, - final int needSize, final int clearTo) - { - final int length = in.length; - if (DO_CHECKS && length >= needSize) { - return in; - } - if (DO_STATS) { - incResizeInt(); - } - - // maybe change bucket: - // ensure getNewSize() > newSize: - final int[] res = getIntArray(getNewSize(usedSize, needSize)); - - System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements - - // maybe return current array: - putIntArray(in, 0, clearTo); // ensure all array is cleared (grow-reduce algo) - - if (DO_LOG_WIDEN_ARRAY) { - logInfo("widenIntArray[" + res.length + "]: usedSize=\t" - + usedSize + "\tlength=\t" + length + "\tneeded length=\t" - + needSize); - } - return res; - } - - void putIntArray(final int[] array, final int fromIndex, - final int toIndex) - { - final int length = array.length; - // odd sized array are non-cached arrays (initial arrays) - // ensure to never store initial arrays in cache: - if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) { - getIntArrayCache(length).putArray(array, length, fromIndex, toIndex); - } - } - - // dirty int array cache - IntArrayCache getDirtyIntArrayCache(final int length) { - final int bucket = ArrayCache.getBucket(length); - return getArrayCachesHolder().dirtyIntArrayCaches[bucket]; - } - - int[] getDirtyIntArray(final int length) { - if (length <= MAX_ARRAY_SIZE) { - return getDirtyIntArrayCache(length).getArray(); - } - - if (DO_STATS) { - incOversize(); - } - - if (DO_LOG_OVERSIZE) { - logInfo("getDirtyIntArray[oversize]: length=\t" + length); - } - - return new int[length]; - } - - int[] widenDirtyIntArray(final int[] in, - final int usedSize, final int needSize) - { - final int length = in.length; - if (DO_CHECKS && length >= needSize) { - return in; - } - if (DO_STATS) { - incResizeDirtyInt(); - } - - // maybe change bucket: - // ensure getNewSize() > newSize: - final int[] res = getDirtyIntArray(getNewSize(usedSize, needSize)); - - System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements - - // maybe return current array: - // NO clean-up of array data = DIRTY ARRAY - putDirtyIntArray(in); - - if (DO_LOG_WIDEN_ARRAY) { - logInfo("widenDirtyIntArray[" + res.length + "]: usedSize=\t" - + usedSize + "\tlength=\t" + length + "\tneeded length=\t" - + needSize); - } - return res; - } - - void putDirtyIntArray(final int[] array) { - final int length = array.length; - // odd sized array are non-cached arrays (initial arrays) - // ensure to never store initial arrays in cache: - if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) { - getDirtyIntArrayCache(length).putDirtyArray(array, length); - } - } - - // dirty float array cache - FloatArrayCache getDirtyFloatArrayCache(final int length) { - final int bucket = ArrayCache.getBucket(length); - return getArrayCachesHolder().dirtyFloatArrayCaches[bucket]; - } - - float[] getDirtyFloatArray(final int length) { - if (length <= MAX_ARRAY_SIZE) { - return getDirtyFloatArrayCache(length).getArray(); - } - - if (DO_STATS) { - incOversize(); - } - - if (DO_LOG_OVERSIZE) { - logInfo("getDirtyFloatArray[oversize]: length=\t" + length); - } - - return new float[length]; - } - - float[] widenDirtyFloatArray(final float[] in, - final int usedSize, final int needSize) - { - final int length = in.length; - if (DO_CHECKS && length >= needSize) { - return in; - } - if (DO_STATS) { - incResizeDirtyFloat(); - } - - // maybe change bucket: - // ensure getNewSize() > newSize: - final float[] res = getDirtyFloatArray(getNewSize(usedSize, needSize)); - - System.arraycopy(in, 0, res, 0, usedSize); // copy only used elements - - // maybe return current array: - // NO clean-up of array data = DIRTY ARRAY - putDirtyFloatArray(in); - - if (DO_LOG_WIDEN_ARRAY) { - logInfo("widenDirtyFloatArray[" + res.length + "]: usedSize=\t" - + usedSize + "\tlength=\t" + length + "\tneeded length=\t" - + needSize); - } - return res; - } - - void putDirtyFloatArray(final float[] array) { - final int length = array.length; - // odd sized array are non-cached arrays (initial arrays) - // ensure to never store initial arrays in cache: - if (((length & 0x1) == 0) && (length <= MAX_ARRAY_SIZE)) { - getDirtyFloatArrayCache(length).putDirtyArray(array, length); - } - } - - /* class holding all array cache instances */ - static final class ArrayCachesHolder { - // zero-filled int array cache: - final IntArrayCache[] intArrayCaches; - // dirty array caches: - final IntArrayCache[] dirtyIntArrayCaches; - final FloatArrayCache[] dirtyFloatArrayCaches; - final ByteArrayCache[] dirtyByteArrayCaches; - - ArrayCachesHolder() { - intArrayCaches = new IntArrayCache[BUCKETS]; - dirtyIntArrayCaches = new IntArrayCache[BUCKETS]; - dirtyFloatArrayCaches = new FloatArrayCache[BUCKETS]; - dirtyByteArrayCaches = new ByteArrayCache[BUCKETS]; - - for (int i = 0; i < BUCKETS; i++) { - intArrayCaches[i] = new IntArrayCache(ARRAY_SIZES[i]); - // dirty array caches: - dirtyIntArrayCaches[i] = new IntArrayCache(ARRAY_SIZES[i]); - dirtyFloatArrayCaches[i] = new FloatArrayCache(ARRAY_SIZES[i]); - dirtyByteArrayCaches[i] = new ByteArrayCache(DIRTY_BYTE_ARRAY_SIZES[i]); - } - } + ByteArrayCache.Reference newDirtyByteArrayRef(final int initialSize) { + return dirtyByteCache.createRef(initialSize); } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java index 0ed91854331..16c7aa19512 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/RendererStats.java @@ -30,6 +30,8 @@ import java.security.PrivilegedAction; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; +import jdk.internal.ref.CleanerFactory; +import sun.java2d.marlin.ArrayCacheConst.CacheStats; import static sun.java2d.marlin.MarlinUtils.logInfo; import sun.java2d.marlin.stats.Histogram; import sun.java2d.marlin.stats.Monitor; @@ -41,26 +43,22 @@ import sun.awt.util.ThreadGroupUtils; */ public final class RendererStats implements MarlinConst { - // singleton - private static volatile RendererStats SINGLETON = null; + static RendererStats createInstance(final Object parent, final String name) + { + final RendererStats stats = new RendererStats(name); - static RendererStats getInstance() { - if (SINGLETON == null) { - SINGLETON = new RendererStats(); - } - return SINGLETON; + // Keep a strong reference to dump it later: + RendererStatsHolder.getInstance().add(parent, stats); + + return stats; } public static void dumpStats() { - if (SINGLETON != null) { - SINGLETON.dump(); - } + RendererStatsHolder.dumpStats(); } - /* RendererContext collection as hard references - (only used for debugging purposes) */ - static final ConcurrentLinkedQueue ALL_CONTEXTS - = new ConcurrentLinkedQueue(); + // context name (debugging purposes) + final String name; // stats final StatLong stat_cache_rowAA = new StatLong("cache.rowAA"); @@ -118,7 +116,7 @@ public final class RendererStats implements MarlinConst { final StatLong stat_array_stroker_polystack_curveTypes = new StatLong("array.stroker.polystack.curveTypes.d_byte"); final StatLong stat_array_marlincache_rowAAChunk - = new StatLong("array.marlincache.rowAAChunk.d_byte"); + = new StatLong("array.marlincache.rowAAChunk.resize"); final StatLong stat_array_marlincache_touchedTile = new StatLong("array.marlincache.touchedTile.int"); final StatLong stat_array_renderer_alphaline @@ -136,6 +134,10 @@ public final class RendererStats implements MarlinConst { final StatLong stat_array_renderer_aux_edgePtrs = new StatLong("array.renderer.aux_edgePtrs.int"); // histograms + final Histogram hist_rdr_edges_count + = new Histogram("renderer.edges.count"); + final Histogram hist_rdr_poly_stack_curves + = new Histogram("renderer.polystack.curves"); final Histogram hist_rdr_crossings = new Histogram("renderer.crossings"); final Histogram hist_rdr_crossings_ratio @@ -181,6 +183,8 @@ public final class RendererStats implements MarlinConst { stat_rdr_crossings_sorts, stat_rdr_crossings_bsearch, stat_rdr_crossings_msorts, + hist_rdr_edges_count, + hist_rdr_poly_stack_curves, hist_rdr_crossings, hist_rdr_crossings_ratio, hist_rdr_crossings_adds, @@ -233,95 +237,145 @@ public final class RendererStats implements MarlinConst { mon_ptg_getAlpha, mon_debug }; + // offheap stats + long totalOffHeapInitial = 0L; + // live accumulator + long totalOffHeap = 0L; + long totalOffHeapMax = 0L; + // cache stats + CacheStats[] cacheStats = null; - private RendererStats() { - super(); - - AccessController.doPrivileged( - (PrivilegedAction) () -> { - final Thread hook = new Thread( - ThreadGroupUtils.getRootThreadGroup(), - new Runnable() { - @Override - public void run() { - dump(); - } - }, - "MarlinStatsHook" - ); - hook.setContextClassLoader(null); - Runtime.getRuntime().addShutdownHook(hook); - - if (USE_DUMP_THREAD) { - final Timer statTimer = new Timer("RendererStats"); - statTimer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - dump(); - } - }, DUMP_INTERVAL, DUMP_INTERVAL); - } - return null; - } - ); + private RendererStats(final String name) { + this.name = name; } void dump() { - if (DO_STATS) { - ArrayCache.dumpStats(); - } - for (RendererContext rdrCtx : ALL_CONTEXTS) { - logInfo("RendererContext: " + rdrCtx.name); + logInfo("RendererContext: " + name); - if (DO_MONITORS) { + if (DO_MONITORS) { + for (Monitor monitor : monitors) { + if (monitor.count != 0) { + logInfo(monitor.toString()); + } + } + // As getAATileGenerator percents: + final long total = mon_pre_getAATileGenerator.sum; + if (total != 0L) { for (Monitor monitor : monitors) { - if (monitor.count != 0) { - logInfo(monitor.toString()); - } + logInfo(monitor.name + " : " + + ((100d * monitor.sum) / total) + " %"); } - // As getAATileGenerator percents: - final long total = mon_pre_getAATileGenerator.sum; - if (total != 0L) { - for (Monitor monitor : monitors) { - logInfo(monitor.name + " : " - + ((100d * monitor.sum) / total) + " %"); - } + } + if (DO_FLUSH_MONITORS) { + for (Monitor m : monitors) { + m.reset(); } - if (DO_FLUSH_MONITORS) { - for (Monitor m : monitors) { - m.reset(); + } + } + + if (DO_STATS) { + for (StatLong stat : statistics) { + if (stat.count != 0) { + logInfo(stat.toString()); + if (DO_FLUSH_STATS) { + stat.reset(); } } } - if (DO_STATS) { - for (StatLong stat : statistics) { - if (stat.count != 0) { - logInfo(stat.toString()); + logInfo("OffHeap footprint: initial: " + totalOffHeapInitial + + " bytes - max: " + totalOffHeapMax + " bytes"); + if (DO_FLUSH_STATS) { + totalOffHeapMax = 0L; + } + + logInfo("Array caches for RendererContext: " + name); + + long totalInitialBytes = totalOffHeapInitial; + long totalCacheBytes = 0L; + + if (cacheStats != null) { + for (CacheStats stat : cacheStats) { + totalCacheBytes += stat.dumpStats(); + totalInitialBytes += stat.getTotalInitialBytes(); + if (DO_FLUSH_STATS) { stat.reset(); } } - // IntArrayCaches stats: - final RendererContext.ArrayCachesHolder holder - = rdrCtx.getArrayCachesHolder(); + } + logInfo("Heap footprint: initial: " + totalInitialBytes + + " bytes - cache: " + totalCacheBytes + " bytes"); + } + } - logInfo("Array caches for thread: " + rdrCtx.name); + static final class RendererStatsHolder { - for (IntArrayCache cache : holder.intArrayCaches) { - cache.dumpStats(); - } + // singleton + private static volatile RendererStatsHolder SINGLETON = null; - logInfo("Dirty Array caches for thread: " + rdrCtx.name); + static synchronized RendererStatsHolder getInstance() { + if (SINGLETON == null) { + SINGLETON = new RendererStatsHolder(); + } + return SINGLETON; + } - for (IntArrayCache cache : holder.dirtyIntArrayCaches) { - cache.dumpStats(); - } - for (FloatArrayCache cache : holder.dirtyFloatArrayCaches) { - cache.dumpStats(); - } - for (ByteArrayCache cache : holder.dirtyByteArrayCaches) { - cache.dumpStats(); + static void dumpStats() { + if (SINGLETON != null) { + SINGLETON.dump(); + } + } + + /* RendererStats collection as hard references + (only used for debugging purposes) */ + private final ConcurrentLinkedQueue allStats + = new ConcurrentLinkedQueue(); + + private RendererStatsHolder() { + AccessController.doPrivileged( + (PrivilegedAction) () -> { + final Thread hook = new Thread( + ThreadGroupUtils.getRootThreadGroup(), + new Runnable() { + @Override + public void run() { + dump(); + } + }, + "MarlinStatsHook" + ); + hook.setContextClassLoader(null); + Runtime.getRuntime().addShutdownHook(hook); + + if (USE_DUMP_THREAD) { + final Timer statTimer = new Timer("RendererStats"); + statTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + dump(); + } + }, DUMP_INTERVAL, DUMP_INTERVAL); + } + return null; } + ); + } + + void add(final Object parent, final RendererStats stats) { + allStats.add(stats); + + // Register a cleaning function to ensure removing dead entries: + CleanerFactory.cleaner().register(parent, () -> remove(stats)); + } + + void remove(final RendererStats stats) { + stats.dump(); // dump anyway + allStats.remove(stats); + } + + void dump() { + for (RendererStats stats : allStats) { + stats.dump(); } } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java index f25993b29ee..44b9a62e417 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java @@ -1205,6 +1205,12 @@ final class Stroker implements PathConsumer2D, MarlinConst { private static final byte TYPE_QUADTO = (byte) 1; private static final byte TYPE_CUBICTO = (byte) 2; + // curves capacity = edges count (4096) = half edges x 2 (coords) + private static final int INITIAL_CURVES_COUNT = INITIAL_EDGES_COUNT; + + // types capacity = half edges count (2048) + private static final int INITIAL_TYPES_COUNT = INITIAL_EDGES_COUNT >> 1; + float[] curves; int end; byte[] curveTypes; @@ -1213,10 +1219,10 @@ final class Stroker implements PathConsumer2D, MarlinConst { // per-thread renderer context final RendererContext rdrCtx; - // per-thread initial arrays (large enough to satisfy most usages: 8192) - // +1 to avoid recycling in Helpers.widenArray() - private final float[] curves_initial = new float[INITIAL_LARGE_ARRAY + 1]; // 32K - private final byte[] curveTypes_initial = new byte[INITIAL_LARGE_ARRAY + 1]; // 8K + // curves ref (dirty) + final FloatArrayCache.Reference curves_ref; + // curveTypes ref (dirty) + final ByteArrayCache.Reference curveTypes_ref; // used marks (stats only) int curveTypesUseMark; @@ -1229,10 +1235,13 @@ final class Stroker implements PathConsumer2D, MarlinConst { PolyStack(final RendererContext rdrCtx) { this.rdrCtx = rdrCtx; - curves = curves_initial; - curveTypes = curveTypes_initial; - end = 0; + curves_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_CURVES_COUNT); // 16K + curves = curves_ref.initial; + + curveTypes_ref = rdrCtx.newDirtyByteArrayRef(INITIAL_TYPES_COUNT); // 2K + curveTypes = curveTypes_ref.initial; numCurves = 0; + end = 0; if (DO_STATS) { curveTypesUseMark = 0; @@ -1249,10 +1258,10 @@ final class Stroker implements PathConsumer2D, MarlinConst { numCurves = 0; if (DO_STATS) { - rdrCtx.stats.stat_rdr_poly_stack_types - .add(curveTypesUseMark); - rdrCtx.stats.stat_rdr_poly_stack_curves - .add(curvesUseMark); + rdrCtx.stats.stat_rdr_poly_stack_types.add(curveTypesUseMark); + rdrCtx.stats.stat_rdr_poly_stack_curves.add(curvesUseMark); + rdrCtx.stats.hist_rdr_poly_stack_curves.add(curvesUseMark); + // reset marks curveTypesUseMark = 0; curvesUseMark = 0; @@ -1260,15 +1269,8 @@ final class Stroker implements PathConsumer2D, MarlinConst { // Return arrays: // curves and curveTypes are kept dirty - if (curves != curves_initial) { - rdrCtx.putDirtyFloatArray(curves); - curves = curves_initial; - } - - if (curveTypes != curveTypes_initial) { - rdrCtx.putDirtyByteArray(curveTypes); - curveTypes = curveTypes_initial; - } + curves = curves_ref.putArray(curves); + curveTypes = curveTypes_ref.putArray(curveTypes); } private void ensureSpace(final int n) { @@ -1278,16 +1280,16 @@ final class Stroker implements PathConsumer2D, MarlinConst { rdrCtx.stats.stat_array_stroker_polystack_curves .add(end + n); } - curves = rdrCtx.widenDirtyFloatArray(curves, end, end + n); + curves = curves_ref.widenArray(curves, end, end + n); } if (curveTypes.length <= numCurves) { if (DO_STATS) { rdrCtx.stats.stat_array_stroker_polystack_curveTypes .add(numCurves + 1); } - curveTypes = rdrCtx.widenDirtyByteArray(curveTypes, - numCurves, - numCurves + 1); + curveTypes = curveTypes_ref.widenArray(curveTypes, + numCurves, + numCurves + 1); } } diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java index dc0a9255975..572db721c70 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/Version.java @@ -27,7 +27,7 @@ package sun.java2d.marlin; public final class Version { - private static final String VERSION = "marlin-0.7.3.4-Unsafe-OpenJDK"; + private static final String VERSION = "marlin-0.7.4-Unsafe-OpenJDK"; public static String getVersion() { return VERSION; diff --git a/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java b/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java index 79fc9ac0ff4..70d2439f6ae 100644 --- a/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java +++ b/jdk/test/sun/java2d/marlin/ArrayCacheSizeTest.java @@ -21,7 +21,7 @@ * questions. */ -import sun.java2d.marlin.ArrayCache; +import sun.java2d.marlin.ArrayCacheConst; /* * @test @@ -72,7 +72,7 @@ public class ArrayCacheSizeTest { private static void testNewSize(final int curSize, final int needSize) { - int size = ArrayCache.getNewSize(curSize, needSize); + int size = ArrayCacheConst.getNewSize(curSize, needSize); System.out.println("getNewSize(" + curSize + ", " + needSize + ") = " + size); @@ -118,7 +118,7 @@ public class ArrayCacheSizeTest { private static void testNewLargeSize(final long curSize, final long needSize) { - long size = ArrayCache.getNewLargeSize(curSize, needSize); + long size = ArrayCacheConst.getNewLargeSize(curSize, needSize); System.out.println("getNewLargeSize(" + curSize + ", " + needSize + ") = " + size); From 3c2ec5319e9cd84c386cbcb71ddf31fd577dd456 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Wed, 3 Aug 2016 17:01:51 -0700 Subject: [PATCH 008/115] 8155960: TIFF javadoc contains HTML entities inside {@code} tags Remove   from inside @code tags. Reviewed-by: prr --- .../com/sun/imageio/plugins/tiff/TIFFColorConverter.java | 4 ++-- .../com/sun/imageio/plugins/tiff/TIFFDecompressor.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java index 14aa2540acb..dd35d2e9204 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java @@ -47,7 +47,7 @@ public abstract class TIFFColorConverter { * @throws NullPointerException if {@code result} is * {@code null}. * @throws ArrayIndexOutOfBoundsException if - * {@code result.length < 3}. + * {@code result.length < 3}. */ public abstract void fromRGB(float r, float g, float b, float[] result); @@ -63,7 +63,7 @@ public abstract class TIFFColorConverter { * @throws NullPointerException if {@code rgb} is * {@code null}. * @throws ArrayIndexOutOfBoundsException if - * {@code rgb.length < 3}. + * {@code rgb.length < 3}. */ public abstract void toRGB(float x0, float x1, float x2, float[] rgb); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java index bdd31218e03..f89d0de18b6 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java @@ -353,7 +353,7 @@ public abstract class TIFFDecompressor { *

The pixels in the source region to be copied are * those with X coordinates of the form {@code activeSrcMinX + * k*subsampleX}, where {@code k} is an integer such - * that {@code 0 ≤ k < dstWidth}. + * that {@code 0 <= k < dstWidth}. */ protected int activeSrcMinX; @@ -365,7 +365,7 @@ public abstract class TIFFDecompressor { *

The pixels in the source region to be copied are * those with Y coordinates of the form {@code activeSrcMinY + * k*subsampleY}, where {@code k} is an integer such - * that {@code 0 ≤ k < dstHeight}. + * that {@code 0 <= k < dstHeight}. */ protected int activeSrcMinY; From 3673248f32dd9132da12d38e0eaeb55fa39f70ca Mon Sep 17 00:00:00 2001 From: Christoph Langer Date: Thu, 4 Aug 2016 15:58:28 +0200 Subject: [PATCH 009/115] 8163177: Fix for 8152971 breaks builds with VS2010 Reviewed-by: simonis, pnarayanan --- .../windows/native/libfontmanager/fontpath.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c b/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c index 9d2d6c8ceaf..f31fd242b98 100644 --- a/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c +++ b/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c @@ -263,6 +263,7 @@ static int CALLBACK EnumFamilyNamesW( jstring familyLC; size_t slen; LOGFONTW lfw; + jboolean mapHasKey; /* Exceptions indicate critical errors such that program cannot continue * with further execution. Henceforth, the function returns immediately @@ -311,10 +312,10 @@ static int CALLBACK EnumFamilyNamesW( } /* check if already seen this family with a different charset */ - jboolean mapHasKey = (*env)->CallBooleanMethod(env, - fmi->familyToFontListMap, - fmi->containsKeyMID, - familyLC); + mapHasKey = (*env)->CallBooleanMethod(env, + fmi->familyToFontListMap, + fmi->containsKeyMID, + familyLC); if ((*env)->ExceptionCheck(env)) { /* Delete the created references before return */ DeleteLocalReference(env, fmi->family); @@ -535,6 +536,7 @@ Java_sun_awt_Win32FontManager_populateFontFileNameMap0 jclass classIDString; jmethodID putMID; GdiFontMapInfo fmi; + LOGFONTW lfw; /* Check we were passed all the maps we need, and do lookup of * methods for JNI up-calls @@ -598,7 +600,6 @@ Java_sun_awt_Win32FontManager_populateFontFileNameMap0 } /* Enumerate fonts via GDI to build maps of fonts and families */ - LOGFONTW lfw; memset(&lfw, 0, sizeof(lfw)); lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */ wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */ From a2e634345b36e0f2985fc8b4b2d0b7ccf7288063 Mon Sep 17 00:00:00 2001 From: Li Jiang Date: Wed, 3 Aug 2016 15:18:58 +0800 Subject: [PATCH 010/115] 8159713: Make the non-translated keywords clear to translator in jar.properties 8161183: Need extra newline in the end of for multi-lines strings in jar.properties Reviewed-by: naoto --- .../classes/sun/tools/jar/resources/jar.properties | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties index e00ee76610d..316a5ccee9c 100644 --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties @@ -68,15 +68,15 @@ error.versioned.info.without.root=\ error.versioned.info.name.notequal=\ module-info.class in a versioned directory contains incorrect name error.versioned.info.requires.public=\ - module-info.class in a versioned directory contains additional requires public + module-info.class in a versioned directory contains additional "requires public" error.versioned.info.requires.added=\ - module-info.class in a versioned directory contains additional requires + module-info.class in a versioned directory contains additional "requires" error.versioned.info.requires.dropped=\ - module-info.class in a versioned directory contains missing requires + module-info.class in a versioned directory contains missing "requires" error.versioned.info.exports.notequal=\ - module-info.class in a versioned directory contains different exports + module-info.class in a versioned directory contains different "exports" error.versioned.info.provides.notequal=\ - module-info.class in a versioned directory contains different provides + module-info.class in a versioned directory contains different "provides" error.invalid.versioned.module.attribute=\ Invalid module descriptor attribute {0} error.missing.provider=\ @@ -209,7 +209,7 @@ main.help.opt.create.update.hash-modules=\ \ directly or indirectly on a modular jar being\n\ \ created or a non-modular jar being updated main.help.opt.create.update.modulepath=\ -\ --modulepath Location of module dependence for generating +\ --modulepath Location of module dependence for generating\n\ \ the hash main.help.opt.create.update.index=\ \ Operation modifiers valid only in create, update, and generate-index mode:\n @@ -229,4 +229,4 @@ main.help.postopt=\ \ '--hash-modules', and '--modulepath'.\n\ \n\ \ Mandatory or optional arguments to long options are also mandatory or optional\n\ -\ for any corresponding short options. \ No newline at end of file +\ for any corresponding short options. From 25e581d03d8650e9abf6facaa5d5600420b63146 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Wed, 3 Aug 2016 09:40:21 -0400 Subject: [PATCH 011/115] 8159284: bigapps/Jetty - assert(jfa->last_Java_sp() > sp()) failed with JFR in use Test condition in assert in frame::safe_for_sender() for entry frames and return false. Reviewed-by: mgronlun, fparain --- hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp | 21 ++--------------- hotspot/src/cpu/sparc/vm/frame_sparc.cpp | 24 +++----------------- hotspot/src/cpu/x86/vm/frame_x86.cpp | 21 ++--------------- hotspot/src/share/vm/runtime/frame.cpp | 13 +++++++++++ hotspot/src/share/vm/runtime/frame.hpp | 2 ++ 5 files changed, 22 insertions(+), 59 deletions(-) diff --git a/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp index 42c61b9a33f..473c4bc67eb 100644 --- a/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp @@ -110,17 +110,7 @@ bool frame::safe_for_sender(JavaThread *thread) { // Entry frame checks if (is_entry_frame()) { // an entry frame must have a valid fp. - - if (!fp_safe) return false; - - // Validate the JavaCallWrapper an entry frame must have - - address jcw = (address)entry_frame_call_wrapper(); - - bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp); - - return jcw_safe; - + return fp_safe && is_entry_frame_valid(thread); } intptr_t* sender_sp = NULL; @@ -210,15 +200,8 @@ bool frame::safe_for_sender(JavaThread *thread) { } // construct the potential sender - frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc); - - // Validate the JavaCallWrapper an entry frame must have - address jcw = (address)sender.entry_frame_call_wrapper(); - - bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp()); - - return jcw_safe; + return sender.is_entry_frame_valid(thread); } CompiledMethod* nm = sender_blob->as_compiled_method_or_null(); diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp index ab6aeeeeabf..c385c2686df 100644 --- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp @@ -225,19 +225,7 @@ bool frame::safe_for_sender(JavaThread *thread) { // Entry frame checks if (is_entry_frame()) { // an entry frame must have a valid fp. - - if (!fp_safe) { - return false; - } - - // Validate the JavaCallWrapper an entry frame must have - - address jcw = (address)entry_frame_call_wrapper(); - - bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > _FP); - - return jcw_safe; - + return fp_safe && is_entry_frame_valid(thread); } intptr_t* younger_sp = sp(); @@ -290,14 +278,8 @@ bool frame::safe_for_sender(JavaThread *thread) { return false; } - if( sender.is_entry_frame()) { - // Validate the JavaCallWrapper an entry frame must have - - address jcw = (address)sender.entry_frame_call_wrapper(); - - bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > sender_fp); - - return jcw_safe; + if (sender.is_entry_frame()) { + return sender.is_entry_frame_valid(thread); } // If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size diff --git a/hotspot/src/cpu/x86/vm/frame_x86.cpp b/hotspot/src/cpu/x86/vm/frame_x86.cpp index ae8628c05d2..1db4b424cf5 100644 --- a/hotspot/src/cpu/x86/vm/frame_x86.cpp +++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp @@ -108,17 +108,7 @@ bool frame::safe_for_sender(JavaThread *thread) { // Entry frame checks if (is_entry_frame()) { // an entry frame must have a valid fp. - - if (!fp_safe) return false; - - // Validate the JavaCallWrapper an entry frame must have - - address jcw = (address)entry_frame_call_wrapper(); - - bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp); - - return jcw_safe; - + return fp_safe && is_entry_frame_valid(thread); } intptr_t* sender_sp = NULL; @@ -209,15 +199,8 @@ bool frame::safe_for_sender(JavaThread *thread) { } // construct the potential sender - frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc); - - // Validate the JavaCallWrapper an entry frame must have - address jcw = (address)sender.entry_frame_call_wrapper(); - - bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp()); - - return jcw_safe; + return sender.is_entry_frame_valid(thread); } CompiledMethod* nm = sender_blob->as_compiled_method_or_null(); diff --git a/hotspot/src/share/vm/runtime/frame.cpp b/hotspot/src/share/vm/runtime/frame.cpp index 82f5ead336d..129a08850db 100644 --- a/hotspot/src/share/vm/runtime/frame.cpp +++ b/hotspot/src/share/vm/runtime/frame.cpp @@ -225,6 +225,19 @@ JavaCallWrapper* frame::entry_frame_call_wrapper_if_safe(JavaThread* thread) con return NULL; } +bool frame::is_entry_frame_valid(JavaThread* thread) const { + // Validate the JavaCallWrapper an entry frame must have + address jcw = (address)entry_frame_call_wrapper(); + bool jcw_safe = (jcw < thread->stack_base()) && (jcw > (address)fp()); // less than stack base + if (!jcw_safe) { + return false; + } + + // Validate sp saved in the java frame anchor + JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor(); + return (jfa->last_Java_sp() > sp()); +} + bool frame::should_be_deoptimized() const { if (_deopt_state == is_deoptimized || !is_compiled_frame() ) return false; diff --git a/hotspot/src/share/vm/runtime/frame.hpp b/hotspot/src/share/vm/runtime/frame.hpp index d3974d713b2..1a122da60c5 100644 --- a/hotspot/src/share/vm/runtime/frame.hpp +++ b/hotspot/src/share/vm/runtime/frame.hpp @@ -166,6 +166,8 @@ class frame VALUE_OBJ_CLASS_SPEC { frame sender_for_interpreter_frame(RegisterMap* map) const; frame sender_for_native_frame(RegisterMap* map) const; + bool is_entry_frame_valid(JavaThread* thread) const; + // All frames: // A low-level interface for vframes: From f108319ee4d7ec6f1976a6563ffb42c003fe1b0d Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Wed, 3 Aug 2016 13:56:27 -0700 Subject: [PATCH 012/115] 8161030: GPL header missing comma after year Added comma. Reviewed-by: coleenp, fparain --- .../share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java | 2 +- .../share/classes/sun/jvm/hotspot/oops/MethodCounters.java | 2 +- hotspot/src/share/vm/oops/methodCounters.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java index 207810dd99b..7519520d7da 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016 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 diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java index ce6ba6c8f37..5f74240ff4b 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016 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 diff --git a/hotspot/src/share/vm/oops/methodCounters.hpp b/hotspot/src/share/vm/oops/methodCounters.hpp index 2a06ab6eb2e..351cbff76b9 100644 --- a/hotspot/src/share/vm/oops/methodCounters.hpp +++ b/hotspot/src/share/vm/oops/methodCounters.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016 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 From 13fca14037e4fc16616a9682d6f8fc5337f34ef9 Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Thu, 4 Aug 2016 08:58:22 +0200 Subject: [PATCH 013/115] 8162881: Effect of -XX:CICompilerCount depends on ordering of other flags Value of CICompilerCount should be range checked after ergo. Don't create C2 compiler threads with TieredStopAtLevel=1. Reviewed-by: kvn --- hotspot/src/share/vm/prims/whitebox.cpp | 5 +- .../vm/runtime/advancedThresholdPolicy.cpp | 15 ++- hotspot/src/share/vm/runtime/globals.hpp | 2 +- .../vm/runtime/simpleThresholdPolicy.cpp | 14 ++- .../arguments/CheckCICompilerCount.java | 97 +++++++++++++------ .../intrinsics/IntrinsicAvailableTest.java | 4 +- .../intrinsics/IntrinsicDisabledTest.java | 10 +- 7 files changed, 98 insertions(+), 49 deletions(-) diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp index e1a83af6739..1761f6c6191 100644 --- a/hotspot/src/share/vm/prims/whitebox.cpp +++ b/hotspot/src/share/vm/prims/whitebox.cpp @@ -667,7 +667,7 @@ WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobje WB_END WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel)) - if (compLevel < CompLevel_none || compLevel > CompLevel_highest_tier) { + if (compLevel < CompLevel_none || compLevel > TieredStopAtLevel) { return false; // Intrinsic is not available on a non-existent compilation level. } jmethodID method_id, compilation_context_id; @@ -677,6 +677,7 @@ WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject metho DirectiveSet* directive; AbstractCompiler* comp = CompileBroker::compiler((int)compLevel); + assert(comp != NULL, "compiler not available"); if (compilation_context != NULL) { compilation_context_id = reflected_method_to_jmid(thread, env, compilation_context); CHECK_JNI_EXCEPTION_(env, JNI_FALSE); @@ -686,7 +687,7 @@ WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject metho // Calling with NULL matches default directive directive = DirectivesStack::getDefaultDirective(comp); } - bool result = CompileBroker::compiler(compLevel)->is_intrinsic_available(mh, directive); + bool result = comp->is_intrinsic_available(mh, directive); DirectivesStack::release(directive); return result; WB_END diff --git a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp index fc1ea544cce..9b8e3e6a394 100644 --- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp +++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp @@ -55,7 +55,8 @@ void AdvancedThresholdPolicy::initialize() { // Simple log n seems to grow too slowly for tiered, try something faster: log n * log log n int log_cpu = log2_intptr(os::active_processor_count()); int loglog_cpu = log2_intptr(MAX2(log_cpu, 1)); - count = MAX2(log_cpu * loglog_cpu, 1) * 3 / 2; + count = MAX2(log_cpu * loglog_cpu * 3 / 2, 2); + FLAG_SET_ERGO(intx, CICompilerCount, count); } #else // On 32-bit systems, the number of compiler threads is limited to 3. @@ -67,12 +68,18 @@ void AdvancedThresholdPolicy::initialize() { /// available to the VM and thus cause the VM to crash. if (FLAG_IS_DEFAULT(CICompilerCount)) { count = 3; + FLAG_SET_ERGO(intx, CICompilerCount, count); } #endif - set_c1_count(MAX2(count / 3, 1)); - set_c2_count(MAX2(count - c1_count(), 1)); - FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count()); + if (TieredStopAtLevel < CompLevel_full_optimization) { + // No C2 compiler thread required + set_c1_count(count); + } else { + set_c1_count(MAX2(count / 3, 1)); + set_c2_count(MAX2(count - c1_count(), 1)); + } + assert(count == c1_count() + c2_count(), "inconsistent compiler thread count"); // Some inlining tuning #ifdef X86 diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 930c51acc17..89314669efd 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -2411,7 +2411,7 @@ public: product(intx, CICompilerCount, CI_COMPILER_COUNT, \ "Number of compiler threads to run") \ range(0, max_jint) \ - constraint(CICompilerCountConstraintFunc, AtParse) \ + constraint(CICompilerCountConstraintFunc, AfterErgo) \ \ product(intx, CompilationPolicyChoice, 0, \ "which compilation policy (0-3)") \ diff --git a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp index e38c69279a9..4f532121fc8 100644 --- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp +++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp @@ -147,12 +147,18 @@ void SimpleThresholdPolicy::initialize() { // performed on 32-bit systems because it can lead to exhaustion // of the virtual memory address space available to the JVM. if (CICompilerCountPerCPU) { - count = MAX2(log2_intptr(os::active_processor_count()), 1) * 3 / 2; + count = MAX2(log2_intptr(os::active_processor_count()) * 3 / 2, 2); + FLAG_SET_ERGO(intx, CICompilerCount, count); } #endif - set_c1_count(MAX2(count / 3, 1)); - set_c2_count(MAX2(count - c1_count(), 1)); - FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count()); + if (TieredStopAtLevel < CompLevel_full_optimization) { + // No C2 compiler thread required + set_c1_count(count); + } else { + set_c1_count(MAX2(count / 3, 1)); + set_c2_count(MAX2(count - c1_count(), 1)); + } + assert(count == c1_count() + c2_count(), "inconsistent compiler thread count"); } void SimpleThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) { diff --git a/hotspot/test/compiler/arguments/CheckCICompilerCount.java b/hotspot/test/compiler/arguments/CheckCICompilerCount.java index 1c361cfdf42..14bbdaa3dc5 100644 --- a/hotspot/test/compiler/arguments/CheckCICompilerCount.java +++ b/hotspot/test/compiler/arguments/CheckCICompilerCount.java @@ -23,8 +23,7 @@ /* * @test CheckCheckCICompilerCount - * @bug 8130858 - * @bug 8132525 + * @bug 8130858 8132525 8162881 * @summary Check that correct range of values for CICompilerCount are allowed depending on whether tiered is enabled or not * @library /testlibrary / * @modules java.base/jdk.internal.misc @@ -53,6 +52,13 @@ public class CheckCICompilerCount { "-XX:CICompilerCount=1", "-version" }, + { + "-server", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-XX:-TieredCompilation", + "-version" + }, { "-client", "-XX:-TieredCompilation", @@ -66,30 +72,31 @@ public class CheckCICompilerCount { "-XX:+PrintFlagsFinal", "-XX:CICompilerCount=1", "-version" + }, + { + "-client", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-XX:-TieredCompilation", + "-version" } }; - private static final String[][] NON_TIERED_EXPECTED_OUTPUTS = { - { + private static final String[] NON_TIERED_EXPECTED_OUTPUTS = { "CICompilerCount (0) must be at least 1", - "Improperly specified VM option 'CICompilerCount=0'" - }, - { - "intx CICompilerCount = 1 {product} {command line}" - }, - { + "intx CICompilerCount = 1 {product} {command line}", + "intx CICompilerCount = 1 {product} {command line}", "CICompilerCount (0) must be at least 1", - "Improperly specified VM option 'CICompilerCount=0'" - }, - { + "intx CICompilerCount = 1 {product} {command line}", "intx CICompilerCount = 1 {product} {command line}" - } }; private static final int[] NON_TIERED_EXIT = { 1, 0, + 0, 1, + 0, 0 }; @@ -101,6 +108,22 @@ public class CheckCICompilerCount { "-XX:CICompilerCount=1", "-version" }, + { + "-server", + "-XX:+TieredCompilation", + "-XX:TieredStopAtLevel=1", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-version" + }, + { + "-server", + "-XX:+TieredCompilation", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-XX:TieredStopAtLevel=1", + "-version" + }, { "-server", "-XX:+TieredCompilation", @@ -115,6 +138,22 @@ public class CheckCICompilerCount { "-XX:CICompilerCount=1", "-version" }, + { + "-client", + "-XX:+TieredCompilation", + "-XX:TieredStopAtLevel=1", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-version" + }, + { + "-client", + "-XX:+TieredCompilation", + "-XX:+PrintFlagsFinal", + "-XX:CICompilerCount=1", + "-XX:TieredStopAtLevel=1", + "-version" + }, { "-client", "-XX:+TieredCompilation", @@ -124,31 +163,29 @@ public class CheckCICompilerCount { } }; - private static final String[][] TIERED_EXPECTED_OUTPUTS = { - { + private static final String[] TIERED_EXPECTED_OUTPUTS = { "CICompilerCount (1) must be at least 2", - "Improperly specified VM option 'CICompilerCount=1'" - }, - { - "intx CICompilerCount = 2 {product} {command line, ergonomic}" - }, - { + "intx CICompilerCount = 1 {product} {command line}", + "intx CICompilerCount = 1 {product} {command line}", + "intx CICompilerCount = 2 {product} {command line}", "CICompilerCount (1) must be at least 2", - "Improperly specified VM option 'CICompilerCount=1'" - }, - { - "intx CICompilerCount = 2 {product} {command line, ergonomic}" - } + "intx CICompilerCount = 1 {product} {command line}", + "intx CICompilerCount = 1 {product} {command line}", + "intx CICompilerCount = 2 {product} {command line}", }; private static final int[] TIERED_EXIT = { 1, 0, + 0, + 0, 1, + 0, + 0, 0 }; - private static void verifyValidOption(String[] arguments, String[] expected_outputs, int exit, boolean tiered) throws Exception { + private static void verifyValidOption(String[] arguments, String expected_output, int exit, boolean tiered) throws Exception { ProcessBuilder pb; OutputAnalyzer out; @@ -157,9 +194,7 @@ public class CheckCICompilerCount { try { out.shouldHaveExitValue(exit); - for (String expected_output : expected_outputs) { - out.shouldContain(expected_output); - } + out.shouldContain(expected_output); } catch (RuntimeException e) { // Check if tiered compilation is available in this JVM // Version. Throw exception only if it is available. diff --git a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java index dd55d5496c9..ddc5bd04f8a 100644 --- a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java +++ b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -114,7 +114,7 @@ public class IntrinsicAvailableTest extends CompilerWhiteBoxTest { public void test() throws Exception { Executable intrinsicMethod = testCase.getExecutable(); - if (Platform.isServer()) { + if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) { if (TIERED_COMPILATION) { checkIntrinsicForCompilationLevel(intrinsicMethod, COMP_LEVEL_SIMPLE); } diff --git a/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java b/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java index 7cbe3cb6088..53cf827602f 100644 --- a/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java +++ b/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java @@ -59,9 +59,9 @@ public class IntrinsicDisabledTest { private static final int COMP_LEVEL_FULL_OPTIMIZATION = 4; /* Determine if tiered compilation is enabled. */ - private static boolean isTieredCompilationEnabled() { - return Boolean.valueOf(Objects.toString(wb.getVMFlag("TieredCompilation"))); - } + private static final boolean TIERED_COMPILATION = wb.getBooleanVMFlag("TieredCompilation"); + + private static final int TIERED_STOP_AT_LEVEL = wb.getIntxVMFlag("TieredStopAtLevel").intValue(); /* This test uses several methods from jdk.internal.misc.Unsafe. The method * getMethod() returns a different Executable for each different @@ -202,8 +202,8 @@ public class IntrinsicDisabledTest { } public static void main(String args[]) { - if (Platform.isServer()) { - if (isTieredCompilationEnabled()) { + if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) { + if (TIERED_COMPILATION) { test(COMP_LEVEL_SIMPLE); } test(COMP_LEVEL_FULL_OPTIMIZATION); From af8e1270cb465e37677b762d8285274a79a1d4fa Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Thu, 4 Aug 2016 10:34:34 +0200 Subject: [PATCH 014/115] 8136818: Test compiler/arraycopy/TestEliminatedArrayCopyDeopt.java fails with "m1 failed" Added missing Op_StoreB check to ArrayCopyNode::may_modify_helper(). Reviewed-by: kvn --- hotspot/src/share/vm/opto/arraycopynode.cpp | 9 ++++++--- .../compiler/arraycopy/TestEliminatedArrayCopyDeopt.java | 1 - 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/opto/arraycopynode.cpp b/hotspot/src/share/vm/opto/arraycopynode.cpp index 08334b22597..f73f09165fb 100644 --- a/hotspot/src/share/vm/opto/arraycopynode.cpp +++ b/hotspot/src/share/vm/opto/arraycopynode.cpp @@ -630,6 +630,12 @@ bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) { } bool ArrayCopyNode::may_modify_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase, ArrayCopyNode*& ac) { + if (n->Opcode() == Op_StoreCM || + n->Opcode() == Op_StoreB) { + // Ignore card mark stores + n = n->in(MemNode::Memory); + } + if (n->is_Proj()) { n = n->in(0); if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) { @@ -657,9 +663,6 @@ bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTra } } } - } else if (n->Opcode() == Op_StoreCM) { - // Ignore card mark stores - return may_modify_helper(t_oop, n->in(MemNode::Memory), phase, ac); } } diff --git a/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java b/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java index 80f81c64c9d..85be6c5d428 100644 --- a/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java +++ b/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java @@ -25,7 +25,6 @@ * @test * @bug 8130847 8156760 * @summary Eliminated instance/array written to by an array copy variant must be correctly initialized when reallocated at a deopt - * @ignore 8136818 * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement * compiler.arraycopy.TestEliminatedArrayCopyDeopt * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement From 127367ce74c7a57be75be275e59307f1c16c618c Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Thu, 4 Aug 2016 14:04:14 +0300 Subject: [PATCH 015/115] 8162852: Mark stress compiler and gc tests with stress keyword Reviewed-by: kvn, tschatzl --- hotspot/test/compiler/codecache/stress/RandomAllocationTest.java | 1 + .../compiler/codecache/stress/UnexpectedDeoptimizationTest.java | 1 + hotspot/test/compiler/codegen/aes/TestAESMain.java | 1 + hotspot/test/gc/g1/ihop/TestIHOPErgo.java | 1 + 4 files changed, 4 insertions(+) diff --git a/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java b/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java index f1b8fd26890..761cbfd4842 100644 --- a/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java +++ b/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java @@ -24,6 +24,7 @@ /* * @test RandomAllocationTest + * @key stress * @summary stressing code cache by allocating randomly sized "dummy" code blobs * @library /testlibrary /test/lib / * @modules java.base/jdk.internal.misc diff --git a/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java b/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java index c6e455d4986..4cd43a154e7 100644 --- a/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java +++ b/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java @@ -24,6 +24,7 @@ /* * @test UnexpectedDeoptimizationTest + * @key stress * @summary stressing code cache by forcing unexpected deoptimizations * @library /testlibrary /test/lib / * @modules java.base/jdk.internal.misc diff --git a/hotspot/test/compiler/codegen/aes/TestAESMain.java b/hotspot/test/compiler/codegen/aes/TestAESMain.java index 679cd880e53..36353ca45f3 100644 --- a/hotspot/test/compiler/codegen/aes/TestAESMain.java +++ b/hotspot/test/compiler/codegen/aes/TestAESMain.java @@ -25,6 +25,7 @@ /** * @test * @bug 7184394 + * @key stress * @summary add intrinsics to use AES instructions * @library /testlibrary / * @modules java.base/jdk.internal.misc diff --git a/hotspot/test/gc/g1/ihop/TestIHOPErgo.java b/hotspot/test/gc/g1/ihop/TestIHOPErgo.java index f187d629842..d70c926e298 100644 --- a/hotspot/test/gc/g1/ihop/TestIHOPErgo.java +++ b/hotspot/test/gc/g1/ihop/TestIHOPErgo.java @@ -24,6 +24,7 @@ /* * @test TestIHOPErgo * @bug 8148397 + * @key stress * @summary Test checks that behavior of Adaptive and Static IHOP at concurrent cycle initiation * @requires vm.gc.G1 * @requires !vm.flightRecorder From d3e6075c944617dfbca24843f3745d7d10fba8a8 Mon Sep 17 00:00:00 2001 From: Max Ockner Date: Thu, 4 Aug 2016 12:24:10 -0400 Subject: [PATCH 016/115] 8159917: Space character is missing in ClassLoaderData::print_value_on Added missing space in ClassLoaderData::print_value_on Reviewed-by: coleenp --- hotspot/src/share/vm/classfile/classLoaderData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp index fc1774d1941..f31b1d0886c 100644 --- a/hotspot/src/share/vm/classfile/classLoaderData.cpp +++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp @@ -1173,7 +1173,7 @@ void ClassLoaderData::print_value_on(outputStream* out) const { if (class_loader() == NULL) { out->print("NULL class_loader"); } else { - out->print("class loader " INTPTR_FORMAT, p2i(this)); + out->print("class loader " INTPTR_FORMAT " ", p2i(this)); class_loader()->print_value_on(out); } } From 9465d5512a8a4df90f432a0b41d002ad3e582042 Mon Sep 17 00:00:00 2001 From: Max Ockner Date: Thu, 4 Aug 2016 12:55:28 -0400 Subject: [PATCH 017/115] 8145543: JPRT jobs see intermittent failures in compiler/floatingpoint/ModNaN.java Not reproducible due to glibc patch which affects current and previous versions. Removed @ignore for compiler/floatingpoint/ModNaN.java Reviewed-by: coleenp, gtriantafill --- hotspot/test/compiler/floatingpoint/ModNaN.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hotspot/test/compiler/floatingpoint/ModNaN.java b/hotspot/test/compiler/floatingpoint/ModNaN.java index a1bdcdcdd61..30bc0285781 100644 --- a/hotspot/test/compiler/floatingpoint/ModNaN.java +++ b/hotspot/test/compiler/floatingpoint/ModNaN.java @@ -26,7 +26,6 @@ * @bug 8015396 * @summary double a%b returns NaN for some (a,b) (|a| < inf, |b|>0) (on Core i7 980X) * - * @ignore 8145543 * @run main compiler.floatingpoint.ModNaN */ From 81b9b7b499c51359ff31ff1964972b943c16c9d2 Mon Sep 17 00:00:00 2001 From: Gerald Thornbrugh Date: Thu, 4 Aug 2016 10:11:35 -0700 Subject: [PATCH 018/115] 8162999: Build give extraneous find warnings Removed JtregNative.gmk line that was part of a merger error Reviewed-by: coleenp, fparain --- hotspot/make/test/JtregNative.gmk | 1 - 1 file changed, 1 deletion(-) diff --git a/hotspot/make/test/JtregNative.gmk b/hotspot/make/test/JtregNative.gmk index efb108ad9f0..ce4a0319909 100644 --- a/hotspot/make/test/JtregNative.gmk +++ b/hotspot/make/test/JtregNative.gmk @@ -50,7 +50,6 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \ $(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \ $(HOTSPOT_TOPDIR)/test/compiler/floatingpoint/ \ $(HOTSPOT_TOPDIR)/test/compiler/calls \ - $(HOTSPOT_TOPDIR)/test/compiler/native \ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \ $(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \ $(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \ From 6325503100bd61491f21ed80b7a863931bcc7a28 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Thu, 4 Aug 2016 16:11:30 -0700 Subject: [PATCH 019/115] 8162670: make of jtreg_tests fails if no tests are run, causing jprt test runs to also fail Clear the jtreg exit code when set to 1. Reviewed-by: stsmirno, dholmes --- jdk/test/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jdk/test/Makefile b/jdk/test/Makefile index 8f2038527a3..6958d9abb58 100644 --- a/jdk/test/Makefile +++ b/jdk/test/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 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 @@ -185,6 +185,9 @@ BUNDLE_UP_AND_EXIT = \ ( \ jtregExitCode=$$? && \ _summary="$(SUMMARY_TXT)"; \ + if [ $${jtregExitCode} = 1 ] ; then \ + jtregExitCode=0; \ + fi; \ $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ if [ -r "$${_summary}" ] ; then \ From 3a4f05d90c18de6043af6771ef445e923d4a2a1b Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Thu, 4 Aug 2016 16:11:49 -0700 Subject: [PATCH 020/115] 8162670: make of jtreg_tests fails if no tests are run, causing jprt test runs to also fail Clear the jtreg exit code when set to 1. Reviewed-by: stsmirno, dholmes --- hotspot/test/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hotspot/test/Makefile b/hotspot/test/Makefile index 2f2f810f37b..07f12c40801 100644 --- a/hotspot/test/Makefile +++ b/hotspot/test/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 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 @@ -226,6 +226,9 @@ BUNDLE_UP_AND_EXIT = \ ( \ jtregExitCode=$$? && \ _summary="$(SUMMARY_TXT)"; \ + if [ $${jtregExitCode} = 1 ] ; then \ + jtregExitCode=0; \ + fi; \ $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ if [ -r "$${_summary}" ] ; then \ From 0052e8dc0bb1030709b7e919dadec59dbb72af32 Mon Sep 17 00:00:00 2001 From: Gustavo Romero Date: Thu, 4 Aug 2016 22:42:05 -0400 Subject: [PATCH 021/115] 8162369: PPC64: Wrong ucontext used after SIGTRAP while in HTM critical section Reviewed-by: simonis --- .../src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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 0003988860c..554dfa42286 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 @@ -238,6 +238,28 @@ JVM_handle_linux_signal(int sig, } } + // Make the signal handler transaction-aware by checking the existence of a + // second (transactional) context with MSR TS bits active. If the signal is + // caught during a transaction, then just return to the HTM abort handler. + // Please refer to Linux kernel document powerpc/transactional_memory.txt, + // section "Signals". + if (uc && uc->uc_link) { + ucontext_t* second_uc = uc->uc_link; + + // MSR TS bits are 29 and 30 (Power ISA, v2.07B, Book III-S, pp. 857-858, + // 3.2.1 "Machine State Register"), however note that ISA notation for bit + // numbering is MSB 0, so for normal bit numbering (LSB 0) they come to be + // bits 33 and 34. It's not related to endianness, just a notation matter. + if (second_uc->uc_mcontext.regs->msr & 0x600000000) { + if (TraceTraps) { + tty->print_cr("caught signal in transaction, " + "ignoring to jump to abort handler"); + } + // Return control to the HTM abort handler. + return true; + } + } + JavaThread* thread = NULL; VMThread* vmthread = NULL; if (os::Linux::signal_handlers_are_installed) { From 7c82dd1d0495945afe71f9bcf7457689acb25dfc Mon Sep 17 00:00:00 2001 From: Ambarish Rapte Date: Fri, 5 Aug 2016 15:48:37 +0530 Subject: [PATCH 022/115] 8039081: [TEST_BUG] Test java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java fails Reviewed-by: serb, psadhukhan --- .../share/classes/java/awt/TrayIcon.java | 3 ++ .../classes/sun/awt/X11/XTrayIconPeer.java | 25 ++++++++++- .../PopupMenuLeakTest/PopupMenuLeakTest.java | 41 ++++++++++++++----- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java b/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java index 7c7a5f9af6f..ccbf0ae0599 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java +++ b/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java @@ -703,6 +703,9 @@ public class TrayIcon { synchronized (this) { p = peer; peer = null; + if (popup != null) { + popup.removeNotify(); + } } if (p != null) { p.dispose(); diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java index fa1ba5dcf03..b4b949c513e 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java @@ -93,7 +93,6 @@ public class XTrayIconPeer implements TrayIconPeer, if (XWM.getWMID() != XWM.METACITY_WM) { parentXED = dummyXED; // We don't like to leave it 'null'. - } else { parentXED = new XEventDispatcher() { // It's executed under AWTLock. @@ -300,10 +299,19 @@ public class XTrayIconPeer implements TrayIconPeer, removeXED(getWindow(), eframeXED); removeXED(eframeParentID, parentXED); + removeListeners(); eframe.realDispose(); balloon.dispose(); + tooltip.dispose(); isTrayIconDisplayed = false; + canvas.dispose(); + canvas = null; + popup = null; + balloon = null; + tooltip = null; XToolkit.targetDisposedPeer(target, this); + target = null; + eframe = null; } public static void suppressWarningString(Window w) { @@ -416,6 +424,12 @@ public class XTrayIconPeer implements TrayIconPeer, eframe.addMouseListener(eventProxy); } + void removeListeners() { + canvas.removeMouseListener(eventProxy); + canvas.removeMouseMotionListener(eventProxy); + eframe.removeMouseListener(eventProxy); + } + long getWindow() { return AWTAccessor.getComponentAccessor() .getPeer(eframe).getWindow(); @@ -550,6 +564,11 @@ public class XTrayIconPeer implements TrayIconPeer, super.repaintImage(doClear || (old_autosize != autosize)); } + + public void dispose() { + super.dispose(); + target = null; + } } @SuppressWarnings("serial") // JDK-implementation class @@ -573,6 +592,10 @@ public class XTrayIconPeer implements TrayIconPeer, repaintImage(true); } + public void dispose() { + observer = null; + } + // Invoke on EDT. protected void repaintImage(boolean doClear) { Graphics g = getGraphics(); diff --git a/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java b/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java index 1b607817698..a8f62ab9c26 100644 --- a/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java +++ b/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 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 @@ -22,17 +22,25 @@ */ /* - @test - @key headful - @bug 8007220 - @summary Reference to the popup leaks after the TrayIcon is removed - @author Petr Pchelko + @test + @key headful + @bug 8007220 8039081 + @summary Reference to the popup leaks after the TrayIcon is removed. + @requires os.family != "windows" @library ../../../../lib/testlibrary/ @build ExtendedRobot @run main/othervm -Xmx50m PopupMenuLeakTest */ -import java.awt.*; +import java.awt.AWTException; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.RenderingHints; +import java.awt.SystemTray; +import java.awt.TrayIcon; import javax.swing.SwingUtilities; import java.awt.image.BufferedImage; @@ -45,7 +53,6 @@ public class PopupMenuLeakTest { static final AtomicReference> iconWeakReference = new AtomicReference<>(); static final AtomicReference> popupWeakReference = new AtomicReference<>(); static ExtendedRobot robot; - public static void main(String[] args) throws Exception { robot = new ExtendedRobot(); SwingUtilities.invokeAndWait(PopupMenuLeakTest::createSystemTrayIcon); @@ -55,8 +62,8 @@ public class PopupMenuLeakTest { sleep(); SwingUtilities.invokeAndWait(PopupMenuLeakTest::removeIcon); sleep(); - assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected"); assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected"); + assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected"); } private static void addNotifyPopup() { @@ -78,12 +85,17 @@ public class PopupMenuLeakTest { private static void assertCollected(WeakReference reference, String message) { java.util.List bytes = new ArrayList<>(); for (int i = 0; i < 5; i ++) { + if (reference.get() == null) { + // reference is collected, avoid OOMs. + break; + } try { while (true) { - bytes.add(new byte[1024]); + bytes.add(new byte[4096]); } } catch (OutOfMemoryError err) { - bytes = new ArrayList<>(); + bytes.clear(); + causeGC(); } } if (reference.get() != null) { @@ -91,6 +103,13 @@ public class PopupMenuLeakTest { } } + private static void causeGC() { + System.gc(); + System.runFinalization(); + robot.delay(1000); + } + + private static void createSystemTrayIcon() { final TrayIcon trayIcon = new TrayIcon(createTrayIconImage()); trayIcon.setImageAutoSize(true); From fdfda0df821b56908cebc9d6a341f4cfabf1ee63 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Fri, 5 Aug 2016 16:20:02 +0300 Subject: [PATCH 023/115] 8162970: Merge error in the DefaultRowSorter.java Reviewed-by: alexsch --- .../share/classes/javax/swing/DefaultRowSorter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java index 3334f5f8342..5bc2f0687a9 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java @@ -81,11 +81,6 @@ import java.util.List; * sort order is unsorted (the same as the model), and columns are * sortable by default. *

- * If the underlying model structure changes (the - * modelStructureChanged method is invoked) the following - * are reset to their default values: Comparators by column, - * current sort order and whether a column is sortable. - *

* DefaultRowSorter is an abstract class. Concrete * subclasses must provide access to the underlying data by invoking * {@code setModelWrapper}. The {@code setModelWrapper} method From b06d871fad6bcc260cac121fecd703512141a86c Mon Sep 17 00:00:00 2001 From: Dmitrij Pochepko Date: Fri, 5 Aug 2016 16:22:30 +0300 Subject: [PATCH 024/115] 8161279: Various JMX-tests timed out Reviewed-by: kvn --- .../compiler/codecache/jmx/ThresholdNotificationsTest.java | 4 +++- .../compiler/codecache/jmx/UsageThresholdExceededTest.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java index 86b22cd5fec..bd22973fe4e 100644 --- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java +++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java @@ -63,7 +63,9 @@ public class ThresholdNotificationsTest implements NotificationListener { public static void main(String[] args) { for (BlobType bt : BlobType.getAvailable()) { - new ThresholdNotificationsTest(bt).runTest(); + if (CodeCacheUtils.isCodeHeapPredictable(bt)) { + new ThresholdNotificationsTest(bt).runTest(); + } } } diff --git a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java index baa2ebe351b..154a096a277 100644 --- a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java +++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java @@ -63,7 +63,9 @@ public class UsageThresholdExceededTest { public static void main(String[] args) { int iterationsCount = Integer.getInteger("jdk.test.lib.iterations", 1); for (BlobType btype : BlobType.getAvailable()) { - new UsageThresholdExceededTest(btype, iterationsCount).runTest(); + if (CodeCacheUtils.isCodeHeapPredictable(btype)) { + new UsageThresholdExceededTest(btype, iterationsCount).runTest(); + } } } From 8d7182f2a747ecefb79f4555b742462b8dc0d49a Mon Sep 17 00:00:00 2001 From: Dmitrij Pochepko Date: Fri, 5 Aug 2016 16:23:44 +0300 Subject: [PATCH 025/115] 8157498: compiler/codecache/jmx/InitialAndMaxUsageTest.java times out on 32-bit platforms Reviewed-by: kvn --- hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java index ea17ba28bdb..a0ca3a46b29 100644 --- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java +++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java @@ -90,7 +90,7 @@ public class InitialAndMaxUsageTest { Asserts.assertEQ(initialUsage, 0L, "Unexpected initial usage"); } ArrayList blobs = new ArrayList<>(); - long minAllocationUnit = Math.max(0, CodeCacheUtils.MIN_ALLOCATION - headerSize); + long minAllocationUnit = Math.max(1, CodeCacheUtils.MIN_ALLOCATION - headerSize); /* now filling code cache with large-sized allocation first, since lots of small allocations takes too much time, so, just a small optimization */ From 6ca8a98449488d6ab9528049357597854f09432a Mon Sep 17 00:00:00 2001 From: Igor Veresov Date: Sat, 6 Aug 2016 11:52:37 -0700 Subject: [PATCH 026/115] 8163313: assert(comp != __null) failed: compiler not available Constrain compLevel parameter in WB_IsIntrinsicAvailable() to supported levels Reviewed-by: kvn --- hotspot/src/share/vm/prims/whitebox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp index 90a9e56da5c..6228453f6cc 100644 --- a/hotspot/src/share/vm/prims/whitebox.cpp +++ b/hotspot/src/share/vm/prims/whitebox.cpp @@ -679,7 +679,7 @@ WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobje WB_END WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel)) - if (compLevel < CompLevel_none || compLevel > TieredStopAtLevel) { + if (compLevel < CompLevel_none || compLevel > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier)) { return false; // Intrinsic is not available on a non-existent compilation level. } jmethodID method_id, compilation_context_id; From 2bd07e4f391204e4afdf0101a5e8e4caad927c78 Mon Sep 17 00:00:00 2001 From: Robin Stevens Date: Mon, 8 Aug 2016 11:40:39 +0400 Subject: [PATCH 027/115] 8161664: Memory leak in com.apple.laf.AquaProgressBarUI removed progress bar still referenced Reviewed-by: serb, alexsch --- .../com/apple/laf/AquaProgressBarUI.java | 8 +- .../8161664/ProgressBarMemoryLeakTest.java | 108 ++++++++++++++++++ 2 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java index 9f5f09bbd1e..1745c910b9c 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java @@ -124,7 +124,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener, if (!progressBar.isIndeterminate()) return; stopAnimationTimer(); // start the animation thread - startAnimationTimer(); + if (progressBar.isDisplayable()) { + startAnimationTimer(); + } } if ("JProgressBar.style".equals(prop)) { @@ -141,7 +143,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener, public void ancestorAdded(final AncestorEvent e) { if (!progressBar.isIndeterminate()) return; - startAnimationTimer(); + if (progressBar.isDisplayable()) { + startAnimationTimer(); + } } public void ancestorMoved(final AncestorEvent e) { } diff --git a/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java b/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java new file mode 100644 index 00000000000..b79d03b674d --- /dev/null +++ b/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java @@ -0,0 +1,108 @@ +/* + * 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 8161664 + * @summary Memory leak in com.apple.laf.AquaProgressBarUI: removed progress bar still referenced + * @library ../../regtesthelpers + * @build Util + * @key headful + * @run main/timeout=300/othervm -Xmx16m ProgressBarMemoryLeakTest + */ +import java.awt.EventQueue; +import java.lang.ref.WeakReference; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class ProgressBarMemoryLeakTest { + + private static JFrame sFrame; + private static WeakReference sProgressBar; + + public static void main(String[] args) throws Exception { + UIManager.LookAndFeelInfo[] installedLookAndFeels = UIManager.getInstalledLookAndFeels(); + for ( UIManager.LookAndFeelInfo installedLookAndFeel : installedLookAndFeels ) { + executeTestCase(installedLookAndFeel.getClassName()); + } + } + + private static void executeTestCase(String lookAndFeelString) throws Exception{ + if (tryLookAndFeel(lookAndFeelString)) { + EventQueue.invokeAndWait( new Runnable() { + @Override + public void run() { + showUI(); + } + } ); + EventQueue.invokeAndWait( new Runnable() { + @Override + public void run() { + disposeUI(); + } + } ); + Util.generateOOME(); + JProgressBar progressBar = sProgressBar.get(); + if ( progressBar != null ) { + throw new RuntimeException( "Progress bar (using L&F: " + lookAndFeelString + ") should have been GC-ed" ); + } + } + } + + private static void showUI(){ + sFrame = new JFrame(); + + JProgressBar progressBar = new JProgressBar(); + progressBar.setVisible(false); + progressBar.setIndeterminate(false); + progressBar.setIndeterminate(true); + progressBar.setIndeterminate(false); + progressBar.setValue(10); + progressBar.setString("Progress"); + + sFrame.add(progressBar); + + sProgressBar = new WeakReference<>(progressBar); + + sFrame.setSize(200,200); + sFrame.setVisible(true); + } + + private static void disposeUI(){ + sFrame.setContentPane(new JPanel()); + sFrame.dispose(); + sFrame = null; + } + + private static boolean tryLookAndFeel(String lookAndFeelString) throws Exception { + try { + UIManager.setLookAndFeel(lookAndFeelString); + } catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) { + return false; + } + return true; + } +} From 91f07066008561f5efb254f2006898163e8b39fe Mon Sep 17 00:00:00 2001 From: Dmitrij Pochepko Date: Mon, 8 Aug 2016 11:30:46 +0300 Subject: [PATCH 028/115] 8163243: [TESTBUG] compiler/codecache/jmx/UsageThresholdIncreasedTest.java failed with: Failed to find sun/hotspot/WhiteBox.class Reviewed-by: iveresov --- .../compiler/codecache/jmx/UsageThresholdIncreasedTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java index 2f628229cf1..f432f8a1e70 100644 --- a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java +++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java @@ -29,9 +29,9 @@ * @modules java.base/jdk.internal.misc * java.management * + * @build compiler.codecache.jmx.UsageThresholdIncreasedTest * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission - * @build compiler.codecache.jmx.UsageThresholdIncreasedTest * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -XX:-UseCodeCacheFlushing -XX:-MethodFlushing * -XX:CompileCommand=compileonly,null::* From 91414d0dfc9b94ff0df9c744766e68a492f0bb6e Mon Sep 17 00:00:00 2001 From: Dmitrij Pochepko Date: Mon, 8 Aug 2016 11:32:11 +0300 Subject: [PATCH 029/115] 8129523: java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java timeout Reviewed-by: kvn --- .../java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java b/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java index 6f4ad86a280..08bce54147f 100644 --- a/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java +++ b/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java @@ -23,7 +23,6 @@ /* * @test LFSingleThreadCachingTest - * @ignore 8129523 * @bug 8046703 * @key randomness * @summary Test verifies that lambda forms are cached when run with single thread @@ -33,7 +32,7 @@ * @build LambdaFormTestCase * @build LFCachingTestCase * @build LFSingleThreadCachingTest - * @run main/othervm LFSingleThreadCachingTest + * @run main/othervm -XX:ReservedCodeCacheSize=128m LFSingleThreadCachingTest */ import java.lang.invoke.MethodHandle; From 4d61582818adcf3690acbb30ab87c688d499701f Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Mon, 8 Aug 2016 21:59:12 +0900 Subject: [PATCH 030/115] 8163272: jhsdb jinfo cannot show system properties Reviewed-by: dholmes, dsamersoff --- .../jvm/hotspot/utilities/ObjectReader.java | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java index 1a8afe111eb..9cb559bf31c 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java @@ -26,6 +26,7 @@ package sun.jvm.hotspot.utilities; import java.lang.reflect.Modifier; import java.util.*; +import java.util.stream.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; @@ -204,15 +205,29 @@ public class ObjectReader { } } - protected Object getHashtable(Instance oop, boolean isProperties) { + private void setPropertiesEntry(java.util.Properties p, Oop oop) { + InstanceKlass ik = (InstanceKlass)oop.getKlass(); + OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;"); + OopField valueField = (OopField)ik.findField("val", "Ljava/lang/Object;"); + + try { + p.setProperty((String)readObject(keyField.getValue(oop)), + (String)readObject(valueField.getValue(oop))); + } catch (ClassNotFoundException ce) { + if (DEBUG) { + debugPrintStackTrace(ce); + } + } + } + + protected Object getHashtable(Instance oop) { InstanceKlass k = (InstanceKlass)oop.getKlass(); OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;"); if (tableField == null) { debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;"); return null; } - java.util.Hashtable table = (isProperties) ? new java.util.Properties() - : new java.util.Hashtable(); + java.util.Hashtable table = new java.util.Hashtable(); ObjArray kvs = (ObjArray)tableField.getValue(oop); long size = kvs.getLength(); debugPrintln("Hashtable$Entry Size = " + size); @@ -225,6 +240,39 @@ public class ObjectReader { return table; } + private Properties getProperties(Instance oop) { + InstanceKlass k = (InstanceKlass)oop.getKlass(); + OopField mapField = (OopField)k.findField("map", "Ljava/util/concurrent/ConcurrentHashMap;"); + if (mapField == null) { + debugPrintln("Could not find field of Ljava/util/concurrent/ConcurrentHashMap"); + return null; + } + + Instance mapObj = (Instance)mapField.getValue(oop); + if (mapObj == null) { + debugPrintln("Could not get map field from java.util.Properties"); + return null; + } + + InstanceKlass mk = (InstanceKlass)mapObj.getKlass(); + OopField tableField = (OopField)mk.findField("table", "[Ljava/util/concurrent/ConcurrentHashMap$Node;"); + if (tableField == null) { + debugPrintln("Could not find field of [Ljava/util/concurrent/ConcurrentHashMap$Node"); + return null; + } + + java.util.Properties props = new java.util.Properties(); + ObjArray kvs = (ObjArray)tableField.getValue(mapObj); + long size = kvs.getLength(); + debugPrintln("ConcurrentHashMap$Node Size = " + size); + LongStream.range(0, size) + .mapToObj(kvs::getObjAt) + .filter(o -> o != null) + .forEach(o -> setPropertiesEntry(props, o)); + + return props; + } + public Object readInstance(Instance oop) throws ClassNotFoundException { Object result = getFromObjTable(oop); if (result == null) { @@ -240,11 +288,11 @@ public class ObjectReader { } if (kls.getName().equals(javaUtilHashtable())) { - return getHashtable(oop, false); + return getHashtable(oop); } if (kls.getName().equals(javaUtilProperties())) { - return getHashtable(oop, true); + return getProperties(oop); } Class clz = readClass(kls); From 6500bf0035617d7e38d7c7bc6070a256ae6646a6 Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Mon, 8 Aug 2016 21:59:33 +0900 Subject: [PATCH 031/115] 8163272: jhsdb jinfo cannot show system properties Reviewed-by: dholmes, dsamersoff --- .../sun/tools/jhsdb/BasicLauncherTest.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java index 4125dbfb4d4..604b28241ee 100644 --- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java +++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java @@ -40,6 +40,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Arrays; +import java.util.Optional; import jdk.testlibrary.JDKToolLauncher; import jdk.testlibrary.Utils; import jdk.testlibrary.OutputAnalyzer; @@ -111,7 +112,8 @@ public class BasicLauncherTest { * @param vmArgs - vm and java arguments to launch test app * @return exit code of tool */ - public static void launch(String expectedMessage, List toolArgs) + public static void launch(String expectedMessage, + Optional unexpectedMessage, List toolArgs) throws IOException { System.out.println("Starting LingeredApp"); @@ -131,6 +133,7 @@ public class BasicLauncherTest { processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);; output.shouldContain(expectedMessage); + unexpectedMessage.ifPresent(output::shouldNotContain); output.shouldHaveExitValue(0); } catch (Exception ex) { @@ -140,13 +143,16 @@ public class BasicLauncherTest { } } - public static void launch(String expectedMessage, String... toolArgs) + public static void launch(String expectedMessage, + String unexpectedMessage, String... toolArgs) throws IOException { - launch(expectedMessage, Arrays.asList(toolArgs)); + launch(expectedMessage, Optional.ofNullable(unexpectedMessage), + Arrays.asList(toolArgs)); } - public static void launchNotOSX(String expectedMessage, String... toolArgs) + public static void launchNotOSX(String expectedMessage, + String unexpectedMessage, String... toolArgs) throws IOException { if (Platform.isOSX()) { @@ -154,6 +160,8 @@ public class BasicLauncherTest { System.out.println("This test is not expected to work on OS X. Skipping"); return; } + + launch(expectedMessage, unexpectedMessage, toolArgs); } public static void testHeapDump() throws IOException { @@ -164,7 +172,7 @@ public class BasicLauncherTest { } dump.deleteOnExit(); - launch("heap written to", "jmap", + launch("heap written to", null, "jmap", "--binaryheap", "--dumpfile=" + dump.getAbsolutePath()); assertTrue(dump.exists() && dump.isFile(), @@ -182,11 +190,12 @@ public class BasicLauncherTest { launchCLHSDB(); - launch("compiler detected", "jmap", "--clstats"); - launchNotOSX("No deadlocks found", "jstack"); - launch("compiler detected", "jmap"); - launch("Java System Properties", "jinfo"); - launch("java.threads", "jsnap"); + launch("compiler detected", null, "jmap", "--clstats"); + launchNotOSX("No deadlocks found", null, "jstack"); + launch("compiler detected", null, "jmap"); + launch("Java System Properties", + "System Properties info not available", "jinfo"); + launch("java.threads", null, "jsnap"); testHeapDump(); From bd4e4b5bfbd8010da555611a653f5cbee83608db Mon Sep 17 00:00:00 2001 From: Sharath Ballal Date: Mon, 8 Aug 2016 17:15:46 +0300 Subject: [PATCH 032/115] 8163269: Testcase missed in push for JDK-8160817 Add missed testcase Reviewed-by: dsamersoff --- .../sa/sadebugd/SADebugDTest.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java diff --git a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java new file mode 100644 index 00000000000..7264ee2cf24 --- /dev/null +++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java @@ -0,0 +1,85 @@ +/* + * 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 + * @summary Checks that the jshdb debugd utility sucessfully starts + * and tries to attach to a running process + * @modules java.base/jdk.internal.misc + * @library /test/lib/share/classes + * + * @run main/othervm SADebugDTest + */ +import java.io.File; +import java.util.concurrent.CountDownLatch; +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.io.Reader; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import static jdk.test.lib.Asserts.assertTrue; +import static jdk.test.lib.Platform.shouldSAAttach; +import static jdk.test.lib.process.ProcessTools.startProcess; + +public class SADebugDTest { + + private static final String GOLDEN = "Attaching to process ID %d and starting RMI services, please wait..."; + + private static final String JAVA_HOME = (System.getProperty("test.jdk") != null) + ? System.getProperty("test.jdk") : System.getProperty("java.home"); + + private static final String JAVA_BIN_DIR + = JAVA_HOME + File.separator + "bin" + File.separator; + + private static final String JHSDB = JAVA_BIN_DIR + "jhsdb"; + + public static void main(String[] args) throws Exception { + + if (!shouldSAAttach()) { + log("Not possible to attach the SA. Skipping the test"); + return; + } + + long ourPid = ProcessHandle.current().getPid(); + + // The string we are expecting in the debugd ouput + String golden = String.format(GOLDEN, ourPid); + + // We are going to run 'jhsdb debugd ' + // The startProcess will block untl the 'golden' string appears in either process' stdout or stderr + // In case of timeout startProcess kills the debugd process + ProcessBuilder pb = new ProcessBuilder(); + pb.command(JHSDB, "debugd", String.valueOf(ourPid)); + Process debugd = startProcess("debugd", pb, null, (line) -> line.trim().contains(golden), 0, TimeUnit.SECONDS); + + // If we are here, this means we have received the golden line and the test has passed + // The debugd remains running, we have to kill it + debugd.destroy(); + + } + + private static void log(String string) { + System.out.println(string); + } + +} From e9ea1b08e89aba0634f386da94eec25d675e13d6 Mon Sep 17 00:00:00 2001 From: Doug Simon Date: Mon, 8 Aug 2016 17:06:21 +0200 Subject: [PATCH 033/115] 8163105: SIGSEGV: constantPoolHandle::constantPoolHandle(ConstantPool*) Simplify CompilerToVM.getConstantPool() and related tests. Reviewed-by: kvn, zmajo --- .../src/jdk/vm/ci/hotspot/CompilerToVM.java | 29 ++- .../HotSpotResolvedJavaMethodImpl.java | 2 +- .../HotSpotResolvedObjectTypeImpl.java | 2 +- .../src/share/vm/jvmci/jvmciCompilerToVM.cpp | 41 ++-- .../jdk/vm/ci/hotspot/CompilerToVMHelper.java | 4 +- .../compilerToVM/GetConstantPoolTest.java | 183 ++++-------------- 6 files changed, 72 insertions(+), 189 deletions(-) diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java index 72f9d18caa3..c96da48e6fc 100644 --- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java +++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java @@ -265,9 +265,10 @@ final class CompilerToVM { native HotSpotResolvedObjectTypeImpl resolveTypeInPool(HotSpotConstantPool constantPool, int cpi) throws LinkageError; /** - * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index {@code cpi} in - * {@code constantPool}. For some opcodes, checks are performed that require the {@code method} - * that contains {@code opcode} to be specified. The values returned in {@code info} are: + * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index + * {@code cpi} in {@code constantPool}. For some opcodes, checks are performed that require the + * {@code method} that contains {@code opcode} to be specified. The values returned in + * {@code info} are: * *

      *     [(int) flags,   // only valid if field is resolved
@@ -556,20 +557,18 @@ final class CompilerToVM {
     native HotSpotResolvedJavaMethodImpl getResolvedJavaMethod(Object base, long displacement);
 
     /**
-     * Read a HotSpot ConstantPool* value from the memory location described by {@code base} plus
-     * {@code displacement} and return the {@link HotSpotConstantPool} wrapping it. This method does
-     * no checking that the memory location actually contains a valid pointer and may crash the VM
-     * if an invalid location is provided. If the {@code base} is null then {@code displacement} is
-     * used by itself. If {@code base} is a {@link HotSpotResolvedJavaMethodImpl},
-     * {@link HotSpotConstantPool} or {@link HotSpotResolvedObjectTypeImpl} then the metaspace
-     * pointer is fetched from that object and added to {@code displacement}. Any other non-null
-     * object type causes an {@link IllegalArgumentException} to be thrown.
+     * Gets the {@code ConstantPool*} associated with {@code object} and returns a
+     * {@link HotSpotConstantPool} wrapping it.
      *
-     * @param base an object to read from or null
-     * @param displacement
-     * @return null or the resolved method for this location
+     * @param object a {@link HotSpotResolvedJavaMethodImpl} or
+     *            {@link HotSpotResolvedObjectTypeImpl} object
+     * @return a {@link HotSpotConstantPool} wrapping the {@code ConstantPool*} associated with
+     *         {@code object}
+     * @throws NullPointerException if {@code object == null}
+     * @throws IllegalArgumentException if {@code object} is neither a
+     *             {@link HotSpotResolvedJavaMethodImpl} nor a {@link HotSpotResolvedObjectTypeImpl}
      */
-    native HotSpotConstantPool getConstantPool(Object base, long displacement);
+    native HotSpotConstantPool getConstantPool(Object object);
 
     /**
      * Read a HotSpot Klass* value from the memory location described by {@code base} plus
diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
index b861b2cec99..196616c4d61 100644
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
@@ -121,7 +121,7 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
         if (metaspaceConstantPool == holder.getConstantPool().getMetaspaceConstantPool()) {
             this.constantPool = holder.getConstantPool();
         } else {
-            this.constantPool = compilerToVM().getConstantPool(null, constMethod + config.constMethodConstantsOffset);
+            this.constantPool = compilerToVM().getConstantPool(this);
         }
 
         final int nameIndex = UNSAFE.getChar(constMethod + config.constMethodNameIndexOffset);
diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
index 636c26c2c6c..b2ff5b32491 100644
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
@@ -445,7 +445,7 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
              * operating on the latest one and that HotSpotResolvedJavaMethodImpls will be able to
              * use the shared copy instead of creating their own instance.
              */
-            constantPool = compilerToVM().getConstantPool(this, config().instanceKlassConstantsOffset);
+            constantPool = compilerToVM().getConstantPool(this);
         }
         return constantPool;
     }
diff --git a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
index 36837cda7f4..edc47626853 100644
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
@@ -461,31 +461,26 @@ C2V_VMENTRY(jobject, getResolvedJavaMethod, (JNIEnv *, jobject, jobject base, jl
   return JNIHandles::make_local(THREAD, result);
 }
 
-C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject base, jlong offset))
+C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject object_handle))
   constantPoolHandle cp;
-  oop base_object = JNIHandles::resolve(base);
-  jlong base_address = 0;
-  if (base_object != NULL) {
-    if (base_object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
-      base_address = HotSpotResolvedJavaMethodImpl::metaspaceMethod(base_object);
-    } else if (base_object->is_a(SystemDictionary::HotSpotConstantPool_klass())) {
-      base_address = HotSpotConstantPool::metaspaceConstantPool(base_object);
-    } else if (base_object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
-      base_address = (jlong) CompilerToVM::asKlass(base_object);
-    } else {
-      THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
-                  err_msg("Unexpected type: %s", base_object->klass()->external_name()));
-    }
+  oop object = JNIHandles::resolve(object_handle);
+  if (object == NULL) {
+    THROW_0(vmSymbols::java_lang_NullPointerException());
   }
-  cp = *((ConstantPool**) (intptr_t) (base_address + offset));
-  if (!cp.is_null()) {
-    JavaValue method_result(T_OBJECT);
-    JavaCallArguments args;
-    args.push_long((jlong) (address) cp());
-    JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
-    return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
+  if (object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
+    cp = CompilerToVM::asMethod(object)->constMethod()->constants();
+  } else if (object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
+    cp = InstanceKlass::cast(CompilerToVM::asKlass(object))->constants();
+  } else {
+    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
+                err_msg("Unexpected type: %s", object->klass()->external_name()));
   }
-  return NULL;
+  assert(!cp.is_null(), "npe");
+  JavaValue method_result(T_OBJECT);
+  JavaCallArguments args;
+  args.push_long((jlong) (address) cp());
+  JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
+  return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
 }
 
 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
@@ -1522,7 +1517,7 @@ JNINativeMethod CompilerToVM::methods[] = {
   {CC "getMaxCallTargetOffset",                       CC "(J)J",                                                                            FN_PTR(getMaxCallTargetOffset)},
   {CC "getResolvedJavaMethodAtSlot",                  CC "(" CLASS "I)" HS_RESOLVED_METHOD,                                                 FN_PTR(getResolvedJavaMethodAtSlot)},
   {CC "getResolvedJavaMethod",                        CC "(Ljava/lang/Object;J)" HS_RESOLVED_METHOD,                                        FN_PTR(getResolvedJavaMethod)},
-  {CC "getConstantPool",                              CC "(Ljava/lang/Object;J)" HS_CONSTANT_POOL,                                          FN_PTR(getConstantPool)},
+  {CC "getConstantPool",                              CC "(Ljava/lang/Object;)" HS_CONSTANT_POOL,                                           FN_PTR(getConstantPool)},
   {CC "getResolvedJavaType",                          CC "(Ljava/lang/Object;JZ)" HS_RESOLVED_KLASS,                                        FN_PTR(getResolvedJavaType)},
   {CC "readConfiguration",                            CC "()[" OBJECT,                                                                      FN_PTR(readConfiguration)},
   {CC "installCode",                                  CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG ")I",    FN_PTR(installCode)},
diff --git a/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java b/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
index f2b40928602..2985ed89a94 100644
--- a/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
+++ b/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
@@ -273,8 +273,8 @@ public class CompilerToVMHelper {
         return CTVM.getResolvedJavaMethod(base, displacement);
     }
 
-    public static HotSpotConstantPool getConstantPool(Object base, long displacement) {
-        return CTVM.getConstantPool(base, displacement);
+    public static HotSpotConstantPool getConstantPool(Object object) {
+        return CTVM.getConstantPool(object);
     }
 
     public static HotSpotResolvedObjectType getResolvedJavaType(Object base,
diff --git a/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java b/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
index ceb35fe6378..097d42e5235 100644
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
@@ -29,187 +29,76 @@
  * @library /testlibrary /test/lib /
  * @library ../common/patches
  * @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules java.base/jdk.internal.org.objectweb.asm
+            java.base/jdk.internal.org.objectweb.asm.tree
+            jdk.vm.ci/jdk.vm.ci.hotspot
  *          jdk.vm.ci/jdk.vm.ci.meta
+ *          jdk.vm.ci/jdk.vm.ci.code
  *
  * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject
  * @build compiler.jvmci.compilerToVM.GetConstantPoolTest
- * @build sun.hotspot.WhiteBox
- * @run driver ClassFileInstaller sun.hotspot.WhiteBox
- *                                sun.hotspot.WhiteBox$WhiteBoxPermission
  * @run main/othervm -Xbootclasspath/a:.
- *                   -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *                   -XX:+UnlockDiagnosticVMOptions
  *                   -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
  *                   compiler.jvmci.compilerToVM.GetConstantPoolTest
  */
 package compiler.jvmci.compilerToVM;
 
-import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Utils;
+import compiler.jvmci.common.CTVMUtilities;
+import compiler.jvmci.common.testcases.TestCase;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject;
+import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
 import jdk.vm.ci.meta.ConstantPool;
-import sun.hotspot.WhiteBox;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Executable;
 
 /**
  * Tests for jdk.vm.ci.hotspot.CompilerToVM::getConstantPool method
  */
 public class GetConstantPoolTest {
-    private static enum TestCase {
-        NULL_BASE {
-            @Override
-            ConstantPool getConstantPool() {
-                return CompilerToVMHelper.getConstantPool(null,
-                        getPtrToCpAddress());
-            }
-        },
-        JAVA_METHOD_BASE {
-            @Override
-            ConstantPool getConstantPool() {
-                HotSpotResolvedJavaMethod methodInstance
-                        = CompilerToVMHelper.getResolvedJavaMethodAtSlot(
-                                TEST_CLASS, 0);
-                Field field;
-                try {
-                    // jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.metaspaceMethod
-                    field = methodInstance.getClass()
-                            .getDeclaredField("metaspaceMethod");
-                    field.setAccessible(true);
-                    field.set(methodInstance, getPtrToCpAddress());
-                } catch (ReflectiveOperationException e) {
-                    throw new Error("TESTBUG : " + e, e);
-                }
 
-                return CompilerToVMHelper.getConstantPool(methodInstance, 0L);
-            }
-        },
-        CONSTANT_POOL_BASE {
-            @Override
-            ConstantPool getConstantPool() {
-                ConstantPool cpInst;
-                try {
-                    cpInst = CompilerToVMHelper.getConstantPool(null,
-                            getPtrToCpAddress());
-                    Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
-                            .getDeclaredField("metaspaceConstantPool");
-                    field.setAccessible(true);
-                    field.set(cpInst, getPtrToCpAddress());
-                } catch (ReflectiveOperationException e) {
-                    throw new Error("TESTBUG : " + e.getMessage(), e);
-                }
-                return CompilerToVMHelper.getConstantPool(cpInst, 0L);
-            }
-        },
-        CONSTANT_POOL_BASE_IN_TWO {
-            @Override
-            ConstantPool getConstantPool() {
-                long ptr = getPtrToCpAddress();
-                ConstantPool cpInst;
-                try {
-                    cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
-                    Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
-                            .getDeclaredField("metaspaceConstantPool");
-                    field.setAccessible(true);
-                    field.set(cpInst, ptr / 2L);
-                } catch (ReflectiveOperationException e) {
-                    throw new Error("TESTBUG : " + e.getMessage(), e);
-                }
-                return CompilerToVMHelper.getConstantPool(cpInst,
-                        ptr - ptr / 2L);
-            }
-        },
-        CONSTANT_POOL_BASE_ZERO {
-            @Override
-            ConstantPool getConstantPool() {
-                long ptr = getPtrToCpAddress();
-                ConstantPool cpInst;
-                try {
-                    cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
-                    Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
-                            .getDeclaredField("metaspaceConstantPool");
-                    field.setAccessible(true);
-                    field.set(cpInst, 0L);
-                } catch (ReflectiveOperationException e) {
-                    throw new Error("TESTBUG : " + e.getMessage(), e);
-                }
-                return CompilerToVMHelper.getConstantPool(cpInst, ptr);
-            }
-        },
-        ;
-        abstract ConstantPool getConstantPool();
+    public static void testMethod(Executable executable) {
+        test(CTVMUtilities.getResolvedMethod(executable));
     }
 
-    private static final WhiteBox WB = WhiteBox.getWhiteBox();
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    public static void testClass(Class cls) {
+        HotSpotResolvedObjectType type = CompilerToVMHelper
+                .lookupType(Utils.toJVMTypeSignature(cls),
+                        GetConstantPoolTest.class, /* resolve = */ true);
+        test(type);
+    }
 
-    private static final Class TEST_CLASS = GetConstantPoolTest.class;
-    private static final long CP_ADDRESS
-            = WB.getConstantPool(GetConstantPoolTest.class);
-
-    public void test(TestCase testCase) {
-        System.out.println(testCase.name());
-        ConstantPool cp = testCase.getConstantPool();
-        String cpStringRep = cp.toString();
-        String cpClassSimpleName
-                = CompilerToVMHelper.HotSpotConstantPoolClass().getSimpleName();
-        if (!cpStringRep.contains(cpClassSimpleName)
-                || !cpStringRep.contains(TEST_CLASS.getName())) {
-            String msg = String.format("%s : "
-                    + " Constant pool is not valid."
-                    + " String representation should contain \"%s\" and \"%s\"",
-                    testCase.name(), cpClassSimpleName,
-                    TEST_CLASS.getName());
-            throw new AssertionError(msg);
-        }
+    private static void test(Object object) {
+        ConstantPool cp = CompilerToVMHelper.getConstantPool(object);
+        System.out.println(object + " -> " + cp);
     }
 
     public static void main(String[] args) {
-        GetConstantPoolTest test = new GetConstantPoolTest();
-        for (TestCase testCase : TestCase.values()) {
-            test.test(testCase);
-        }
-        testObjectBase();
-        testMetaspaceWrapperBase();
+        TestCase.getAllClasses().forEach(GetConstantPoolTest::testClass);
+        TestCase.getAllExecutables().forEach(GetConstantPoolTest::testMethod);
+        testNull();
+        testObject();
     }
 
-    private static void testObjectBase() {
+    private static void testNull() {
         try {
-            Object cp = CompilerToVMHelper.getConstantPool(new Object(), 0L);
-            throw new AssertionError("Test OBJECT_BASE."
+            Object cp = CompilerToVMHelper.getConstantPool(null);
+            throw new AssertionError("Test OBJECT."
+                + " Expected IllegalArgumentException has not been caught");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+    private static void testObject() {
+        try {
+            Object cp = CompilerToVMHelper.getConstantPool(new Object());
+            throw new AssertionError("Test OBJECT."
                 + " Expected IllegalArgumentException has not been caught");
         } catch (IllegalArgumentException iae) {
             // expected
         }
     }
-    private static void testMetaspaceWrapperBase() {
-        try {
-            Object cp = CompilerToVMHelper.getConstantPool(
-                    new PublicMetaspaceWrapperObject() {
-                        @Override
-                        public long getMetaspacePointer() {
-                            return getPtrToCpAddress();
-                        }
-                    }, 0L);
-            throw new AssertionError("Test METASPACE_WRAPPER_BASE."
-                + " Expected IllegalArgumentException has not been caught");
-        } catch (IllegalArgumentException iae) {
-            // expected
-        }
-    }
-
-    private static long getPtrToCpAddress() {
-        Field field;
-        try {
-            field = TEST_CLASS.getDeclaredField("CP_ADDRESS");
-        } catch (NoSuchFieldException nsfe) {
-            throw new Error("TESTBUG : cannot find field \"CP_ADDRESS\" : "
-                    + nsfe.getMessage(), nsfe);
-        }
-        Object base = UNSAFE.staticFieldBase(field);
-        return WB.getObjectAddress(base) + UNSAFE.staticFieldOffset(field);
-    }
 }

From f270d810adbf48014157064b155364fc32f29992 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter 
Date: Mon, 8 Aug 2016 11:09:19 -0700
Subject: [PATCH 034/115] 8150154: AIOOB Exception during sequential write of
 TIFF images

Need to reset isRescaling variable when resetting the ImageWriter.

Reviewed-by: prr
---
 .../imageio/plugins/tiff/TIFFImageWriter.java    |  2 ++
 .../plugins/shared/RepeatingWriteTest.java       | 16 ++++++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
index 9b5e7543203..d2f544ad923 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
@@ -3622,6 +3622,8 @@ public class TIFFImageWriter extends ImageWriter {
         streamMetadata = null;
         imageMetadata = null;
 
+        isRescaling = false;
+
         isWritingSequence = false;
         isWritingEmpty = false;
         isInsertingEmpty = false;
diff --git a/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java b/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
index 28c0f04aa8a..3833a1c3f4e 100644
--- a/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
+++ b/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
@@ -25,7 +25,6 @@
  * @test
  *
  * @bug     8144991 8150154
- * @ignore  8150154
  * @author  a.stepanov
  * @summary Check if repeating image writing doesn't fail
  *          (particularly, no AIOOB occurs)
@@ -103,17 +102,18 @@ public class RepeatingWriteTest {
         reader.setInput(iis);
         BufferedImage img = reader.read(0);
         Color c = new Color(img.getRGB(szRef / 2, szRef / 2));
-
         int w = img.getWidth(), h = img.getHeight();
 
         if (w != szRef || h != szRef) {
             throw new ImageCheckException(fileName +
-                ": invalid image size " + w + " x " + h);
+                ": invalid image size " + w + " x " + h +
+                " expected " + szRef + " x " + szRef);
         }
 
         if (!c.equals(cRef)) {
             throw new ImageCheckException(fileName +
-                ": invalid image color " + c);
+                ": invalid image color " + c +
+                " expected " + cRef);
         }
     }
 
@@ -128,6 +128,14 @@ public class RepeatingWriteTest {
             return;
         }
 
+        // If JDK-8163323 is fixed this if block should be removed.
+        if (format.equals("tiff")
+            && (NAMES[i].equals("TYPE_USHORT_555_RGB")
+                 || NAMES[i].equals("TYPE_USHORT_565_RGB"))
+                && (NAMES[j].equals("TYPE_USHORT_555_RGB")
+                    || NAMES[j].equals("TYPE_USHORT_565_RGB"))) {
+            return;
+        }
 
         String f1 = "test-1-" + NAMES[i] + "." + format;
         String f2 = "test-2-" + NAMES[j] + "." + format;

From fa627e16d56dffd0f0d680a68dd31f02e98debc7 Mon Sep 17 00:00:00 2001
From: Alexander Scherbatiy 
Date: Tue, 9 Aug 2016 10:17:51 +0300
Subject: [PATCH 035/115] 8162856: JSlider thumb is twice smaller on HiDPI
 display

Reviewed-by: prr, serb
---
 .../sun/java/swing/plaf/windows/XPStyle.java  |   3 +-
 .../classes/sun/swing/CachedPainter.java      |  39 ++---
 .../8162856/MetalHiDPISliderThumbTest.java    | 147 ++++++++++++++++++
 3 files changed, 161 insertions(+), 28 deletions(-)
 create mode 100644 jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java

diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
index 641bfed328b..0dbe039f54c 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
@@ -657,7 +657,6 @@ class XPStyle {
 
         protected void paintToImage(Component c, Image image, Graphics g,
                                     int w, int h, Object[] args) {
-            boolean accEnabled = false;
             Skin skin = (Skin)args[0];
             Part part = skin.part;
             State state = (State)args[1];
@@ -668,6 +667,8 @@ class XPStyle {
                 c = skin.component;
             }
             BufferedImage bi = (BufferedImage)image;
+            w = bi.getWidth();
+            h = bi.getHeight();
 
             WritableRaster raster = bi.getRaster();
             DataBufferInt dbi = (DataBufferInt)raster.getDataBuffer();
diff --git a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
index 60876adae6f..818e20dbdd3 100644
--- a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
+++ b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
@@ -100,7 +100,9 @@ public abstract class CachedPainter {
         }
     }
 
-    private Image getImage(Object key, Component c, int w, int h, Object... args) {
+    private Image getImage(Object key, Component c,
+                           int baseWidth, int baseHeight,
+                           int w, int h, Object... args) {
         GraphicsConfiguration config = getGraphicsConfiguration(c);
         ImageCache cache = getCache(key);
         Image image = cache.getImage(key, config, w, h, args);
@@ -127,8 +129,11 @@ public abstract class CachedPainter {
             }
             if (draw) {
                 // Render to the Image
-                Graphics g2 = image.getGraphics();
-                paintToImage(c, image, g2, w, h, args);
+                Graphics2D g2 = (Graphics2D) image.getGraphics();
+                if (w != baseWidth || h != baseHeight) {
+                    g2.scale((double) w / baseWidth, (double) h / baseHeight);
+                }
+                paintToImage(c, image, g2, baseWidth, baseHeight, args);
                 g2.dispose();
             }
 
@@ -149,14 +154,7 @@ public abstract class CachedPainter {
         Image image = cache.getImage(key, config, w, h, args);
 
         if (image == null) {
-            double sx = 1;
-            double sy = 1;
-            if (g instanceof Graphics2D) {
-                AffineTransform tx = ((Graphics2D) g).getTransform();
-                sx = tx.getScaleX();
-                sy = tx.getScaleY();
-            }
-            image = new PainterMultiResolutionCachedImage(sx, sy, w, h);
+            image = new PainterMultiResolutionCachedImage(w, h);
             cache.setImage(key, config, w, h, args, image);
         }
 
@@ -238,17 +236,12 @@ public abstract class CachedPainter {
 
     class PainterMultiResolutionCachedImage extends AbstractMultiResolutionImage {
 
-        private final double scaleX;
-        private final double scaleY;
         private final int baseWidth;
         private final int baseHeight;
         private Component c;
         private Object[] args;
 
-        public PainterMultiResolutionCachedImage(double scaleX, double scaleY,
-                                                 int baseWidth, int baseHeight) {
-            this.scaleX = scaleX;
-            this.scaleY = scaleY;
+        public PainterMultiResolutionCachedImage(int baseWidth, int baseHeight) {
             this.baseWidth = baseWidth;
             this.baseHeight = baseHeight;
         }
@@ -272,7 +265,7 @@ public abstract class CachedPainter {
         public Image getResolutionVariant(double destWidth, double destHeight) {
             int w = (int) Math.ceil(destWidth);
             int h = (int) Math.ceil(destHeight);
-            return getImage(this, c, w, h, args);
+            return getImage(this, c, baseWidth, baseHeight, w, h, args);
         }
 
         @Override
@@ -282,15 +275,7 @@ public abstract class CachedPainter {
 
         @Override
         public java.util.List getResolutionVariants() {
-
-            if (scaleX == 1 && scaleY == 1) {
-                return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
-            }
-
-            return Arrays.asList(
-                    getResolutionVariant(baseWidth, baseHeight),
-                    getResolutionVariant(scaleX * baseWidth, scaleY * baseHeight)
-            );
+            return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
         }
     }
 }
\ No newline at end of file
diff --git a/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java b/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java
new file mode 100644
index 00000000000..1c0701e3acd
--- /dev/null
+++ b/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import javax.swing.JSlider;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/*
+ * @test
+ * @bug 8162856
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main MetalHiDPISliderThumbTest
+ */
+public class MetalHiDPISliderThumbTest {
+
+    public static void main(String[] args) throws Exception {
+
+        SwingUtilities.invokeAndWait(() -> {
+
+            try {
+                UIManager.setLookAndFeel(new MetalLookAndFeel());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+
+            if (!testSliderThumb(true)) {
+                throw new RuntimeException("Horizontal Slider Thumb is not scaled!");
+            }
+
+            if (!testSliderThumb(false)) {
+                throw new RuntimeException("Vertical Slider Thumb is not scaled!");
+            }
+        });
+    }
+
+    private static boolean testSliderThumb(boolean horizontal) {
+        int scale = 3;
+
+        int w = horizontal ? 100 : 20;
+        int h = horizontal ? 20 : 100;
+
+        JSlider testSlider = new JSlider();
+        testSlider.setSize(w, h);
+        Dimension size = new Dimension(w, h);
+        testSlider.setPreferredSize(size);
+        testSlider.setMinimumSize(size);
+        testSlider.setMaximumSize(size);
+        testSlider.setOrientation(horizontal ? JSlider.HORIZONTAL : JSlider.VERTICAL);
+
+        int sw = scale * w;
+        int sh = scale * h;
+
+        final BufferedImage img = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
+
+        Graphics2D g = img.createGraphics();
+        g.scale(scale, scale);
+        testSlider.paint(g);
+        g.dispose();
+
+        if (horizontal) {
+            int y = sh / 2;
+
+            int xMin = 0;
+            int rgb = img.getRGB(xMin, y);
+            for (int i = 0; i < sw; i++) {
+                if (img.getRGB(i, y) != rgb) {
+                    xMin = i;
+                    break;
+                }
+            }
+
+            int xMax = sw - 1;
+            rgb = img.getRGB(xMax, y);
+            for (int i = sw - 1; i > 0; i--) {
+                if (img.getRGB(i, y) != rgb) {
+                    xMax = i;
+                    break;
+                }
+            }
+
+            int d = 3 * scale;
+            int xc = (xMin + xMax) / 2 - d;
+            rgb = img.getRGB(xc, y);
+
+            for (int x = xMin + d; x < xc; x++) {
+                if (img.getRGB(x, y) != rgb) {
+                    return true;
+                }
+            }
+        } else {
+            int x = sw / 2;
+
+            int yMin = 0;
+            int rgb = img.getRGB(x, yMin);
+            for (int i = 0; i < sh; i++) {
+                if (img.getRGB(x, i) != rgb) {
+                    yMin = i;
+                    break;
+                }
+            }
+
+            int yMax = sh - 1;
+            rgb = img.getRGB(x, yMax);
+            for (int i = sh - 1; i > 0; i--) {
+                if (img.getRGB(x, i) != rgb) {
+                    yMax = i;
+                    break;
+                }
+            }
+
+            int d = 3 * scale;
+            int yc = (yMin + yMax) / 2 - d;
+            rgb = img.getRGB(x, yc);
+
+            for (int y = yMin + d; y < yc; y++) {
+                if (img.getRGB(x, y) != rgb) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}

From 74f5aaca1c68acde0ec766a84cec04ff8b210ce9 Mon Sep 17 00:00:00 2001
From: Prasanta Sadhukhan 
Date: Tue, 9 Aug 2016 13:22:58 +0530
Subject: [PATCH 036/115] 5080098: Page Range must be disabled on the common
 print dlg for Non serv-formatted flvrs

Reviewed-by: prr, jdv
---
 .../classes/sun/print/ServiceDialog.java      |   8 +-
 .../attribute/ServiceDlgPageRangeTest.java    | 170 ++++++++++++++++++
 2 files changed, 176 insertions(+), 2 deletions(-)
 create mode 100644 jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java

diff --git a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
index ba2f6370150..59797508b2e 100644
--- a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
+++ b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
@@ -977,6 +977,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
         private JFormattedTextField tfRangeFrom, tfRangeTo;
         private JLabel lblRangeTo;
         private boolean prSupported;
+        private boolean prPgRngSupported;
 
         public PrintRangePanel() {
             super();
@@ -1090,7 +1091,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
         public void focusGained(FocusEvent e) {}
 
         private void setupRangeWidgets() {
-            boolean rangeEnabled = (rbPages.isSelected() && prSupported);
+            boolean rangeEnabled = (rbPages.isSelected() && prPgRngSupported);
             tfRangeFrom.setEnabled(rangeEnabled);
             tfRangeTo.setEnabled(rangeEnabled);
             lblRangeTo.setEnabled(rangeEnabled);
@@ -1136,6 +1137,9 @@ public class ServiceDialog extends JDialog implements ActionListener {
             if (psCurrent.isAttributeCategorySupported(prCategory) ||
                    isAWT) {
                 prSupported = true;
+                prPgRngSupported = psCurrent.isAttributeValueSupported(prAll,
+                                                                     docFlavor,
+                                                                     asCurrent);
             }
 
             SunPageSelection select = SunPageSelection.ALL;
@@ -1175,7 +1179,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
             tfRangeFrom.setValue(min);
             tfRangeTo.setValue(max);
             rbAll.setEnabled(prSupported);
-            rbPages.setEnabled(prSupported);
+            rbPages.setEnabled(prPgRngSupported);
             setupRangeWidgets();
         }
     }
diff --git a/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java b/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java
new file mode 100644
index 00000000000..b35d687b7c0
--- /dev/null
+++ b/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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 5080098
+ * @summary Verify if PageRanges option is disabled for Non service-formatted
+ *          flavors.
+ * @run main/manual ServiceDlgPageRangeTest
+ */
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import javax.print.DocFlavor;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.ServiceUI;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.standard.PageRanges;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class ServiceDlgPageRangeTest {
+
+    private static Thread mainThread;
+    private static boolean testPassed;
+    private static boolean testGeneratedInterrupt;
+    private static DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
+    private static PrintService services[];
+
+    /**
+     * Starts the application.
+     */
+    public static void printTest() {
+
+        System.out.println("\nDefault print service: " +
+                              PrintServiceLookup.lookupDefaultPrintService());
+        System.out.println("is flavor: "+flavor+" supported? "+
+                                     services[0].isDocFlavorSupported(flavor));
+        System.out.println("is Page Ranges category supported? "+
+                   services[0].isAttributeCategorySupported(PageRanges.class));
+        System.out.println("is PageRanges[2] value supported ? "+
+                   services[0].isAttributeValueSupported(
+                                             new PageRanges(2), flavor, null));
+
+        HashPrintRequestAttributeSet prSet = new HashPrintRequestAttributeSet();
+        //prSet.add(new PageRanges(2));
+        PrintService selService = ServiceUI.printDialog(null, 200, 200,
+                                          services, services[0], flavor, prSet);
+
+        System.out.println("\nSelected Values\n");
+        Attribute attr[] = prSet.toArray();
+        for (int x = 0; x < attr.length; x ++) {
+            System.out.println("Attribute: " + attr[x].getName() +
+                                                        " Value: " + attr[x]);
+        }
+    }
+
+    /**
+     * Starts the application.
+     */
+    public static void main(java.lang.String[] args) throws Exception {
+        services = PrintServiceLookup.lookupPrintServices(flavor,  null);
+
+        if (services.length == 0) {
+            System.out.println("No print service found!!");
+            return;
+        }
+        SwingUtilities.invokeAndWait(() -> {
+            doTest(ServiceDlgPageRangeTest::printTest);
+        });
+        mainThread = Thread.currentThread();
+        try {
+            Thread.sleep(600000);
+        } catch (InterruptedException e) {
+            if (!testPassed && testGeneratedInterrupt) {
+                throw new RuntimeException("PageRanges option is not disabled "
+                        + "for for Non serv-formatted flvrs");
+            }
+        }
+        if (!testGeneratedInterrupt) {
+            throw new RuntimeException("user has not executed the test");
+        }
+    }
+
+    public static synchronized void pass() {
+        testPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    public static synchronized void fail() {
+        testPassed = false;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    private static void doTest(Runnable action) {
+        String description
+                = " Visual inspection of print dialog is required.\n"
+                + " A print dialog will be shown.\n "
+                + " Please verify Pages(From/To) option is disabled.\n"
+                + " Press Cancel to close the print dialog.\n"
+                + " If Pages(From/To) option is disabled, press PASS else press FAIL";
+
+        final JDialog dialog = new JDialog();
+        dialog.setTitle("printSelectionTest");
+        JTextArea textArea = new JTextArea(description);
+        textArea.setEditable(false);
+        final JButton testButton = new JButton("Start Test");
+        final JButton passButton = new JButton("PASS");
+        passButton.setEnabled(false);
+        passButton.addActionListener((e) -> {
+            dialog.dispose();
+            pass();
+        });
+        final JButton failButton = new JButton("FAIL");
+        failButton.setEnabled(false);
+        failButton.addActionListener((e) -> {
+            dialog.dispose();
+            fail();
+        });
+        testButton.addActionListener((e) -> {
+            testButton.setEnabled(false);
+            action.run();
+            passButton.setEnabled(true);
+            failButton.setEnabled(true);
+        });
+        JPanel mainPanel = new JPanel(new BorderLayout());
+        mainPanel.add(textArea, BorderLayout.CENTER);
+        JPanel buttonPanel = new JPanel(new FlowLayout());
+        buttonPanel.add(testButton);
+        buttonPanel.add(passButton);
+        buttonPanel.add(failButton);
+        mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+        dialog.add(mainPanel);
+        dialog.pack();
+        dialog.setVisible(true);
+        dialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                System.out.println("main dialog closing");
+                testGeneratedInterrupt = false;
+                mainThread.interrupt();
+            }
+        });
+    }
+}

From 0127b8e8b5041b06cc2ea495e46b055f80a8ae57 Mon Sep 17 00:00:00 2001
From: Jayathirth D V 
Date: Tue, 9 Aug 2016 13:45:17 +0530
Subject: [PATCH 037/115] 8160456: KSS : resource loading issue in
 TIFFMetadataFormat.java

Reviewed-by: prr, bpb
---
 .../com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java       | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
index 94bbdde378c..1091cab9bb2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
@@ -49,7 +49,8 @@ public abstract class TIFFMetadataFormat implements IIOMetadataFormat {
         }
         try {
             ResourceBundle bundle =
-                ResourceBundle.getBundle(resourceBaseName, locale);
+                ResourceBundle.getBundle(resourceBaseName, locale,
+                                         this.getClass().getModule());
             return bundle.getString(key);
         } catch (MissingResourceException e) {
             return null;

From c4a6631fc1e0a258b670322439ce7c294c91a4b6 Mon Sep 17 00:00:00 2001
From: Jayathirth D V 
Date: Tue, 9 Aug 2016 13:55:27 +0530
Subject: [PATCH 038/115] 8160455: KSS : class.forName issue in
 TIFFImageMetadata.java

Reviewed-by: prr, bpb, serb
---
 .../com/sun/imageio/plugins/tiff/TIFFImageMetadata.java   | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
index 933c2da5a6c..6cfcc9a3b34 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
@@ -1465,8 +1465,14 @@ public class TIFFImageMetadata extends IIOMetadata {
                 String className = st.nextToken();
 
                 Object o = null;
+                Class setClass = null;
                 try {
-                    Class setClass = Class.forName(className);
+                    ClassLoader cl = TIFFImageMetadata.class.getClassLoader();
+                    setClass = Class.forName(className, false, cl);
+                    if (!TIFFTagSet.class.isAssignableFrom(setClass)) {
+                        fatal(node, "TagSets in IFD must be subset of"
+                                + " TIFFTagSet class");
+                    }
                     Method getInstanceMethod =
                         setClass.getMethod("getInstance", (Class[])null);
                     o = getInstanceMethod.invoke(null, (Object[])null);

From 56b758957824ec37b2fdce3819b5f313d33eb68d Mon Sep 17 00:00:00 2001
From: Alexander Scherbatiy 
Date: Tue, 9 Aug 2016 12:08:51 +0300
Subject: [PATCH 039/115] 8160986: Bad rendering of Swing UI controls with
 Metal L&F on HiDPI display

Reviewed-by: prr
---
 .../swing/plaf/metal/MetalComboBoxIcon.java   |  12 +-
 .../swing/plaf/metal/MetalIconFactory.java    |  39 +----
 .../swing/plaf/metal/MetalScrollButton.java   |  30 ++--
 .../metal/MetalIcons/MetalHiDPIIconsTest.java | 136 ++++++++++++++++++
 4 files changed, 162 insertions(+), 55 deletions(-)
 create mode 100644 jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java

diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
index 1b1bed9e0b7..7e0446103c3 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
@@ -52,13 +52,11 @@ public class MetalComboBoxIcon implements Icon, Serializable {
 
         g.translate( x, y );
 
-        g.setColor( component.isEnabled() ? MetalLookAndFeel.getControlInfo() : MetalLookAndFeel.getControlShadow() );
-        g.drawLine( 0, 0, iconWidth - 1, 0 );
-        g.drawLine( 1, 1, 1 + (iconWidth - 3), 1 );
-        g.drawLine( 2, 2, 2 + (iconWidth - 5), 2 );
-        g.drawLine( 3, 3, 3 + (iconWidth - 7), 3 );
-        g.drawLine( 4, 4, 4 + (iconWidth - 9), 4 );
-
+        g.setColor(component.isEnabled()
+                   ? MetalLookAndFeel.getControlInfo()
+                   : MetalLookAndFeel.getControlShadow());
+        g.fillPolygon(new int[]{0, 5, iconWidth - 5, iconWidth},
+                      new int[]{0, 5, 5, 0}, 4);
         g.translate( -x, -y );
     }
 
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
index 926835fb896..b7cf9644fbe 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
@@ -1289,11 +1289,7 @@ public class MetalIconFactory implements Serializable {
                 else {
                     g.setColor(MetalLookAndFeel.getControl());
                 }
-                g.fillRect(2, 2, 8, 8);
-                g.fillRect(4, 1, 4, 1);
-                g.fillRect(4, 10, 4, 1);
-                g.fillRect(1, 4, 1, 4);
-                g.fillRect(10, 4, 1, 4);
+                g.fillOval(1, 1, 9, 9);
             }
 
             // draw Dark Circle (start at top, go clockwise)
@@ -1303,35 +1299,14 @@ public class MetalIconFactory implements Serializable {
             else {
                 g.setColor(MetalLookAndFeel.getControlDarkShadow());
             }
-            g.drawLine( 4, 0,  7, 0);
-            g.drawLine( 8, 1,  9, 1);
-            g.drawLine(10, 2, 10, 3);
-            g.drawLine(11, 4, 11, 7);
-            g.drawLine(10, 8, 10, 9);
-            g.drawLine( 9,10,  8,10);
-            g.drawLine( 7,11,  4,11);
-            g.drawLine( 3,10,  2,10);
-            g.drawLine( 1, 9,  1, 8);
-            g.drawLine( 0, 7,  0, 4);
-            g.drawLine( 1, 3,  1, 2);
-            g.drawLine( 2, 1,  3, 1);
+            g.drawOval(0, 0, 11, 11);
 
             if (pressed) {
-                g.fillRect(1, 4, 1, 4);
-                g.fillRect(2, 2, 1, 2);
-                g.fillRect(3, 2, 1, 1);
-                g.fillRect(4, 1, 4, 1);
+                g.drawArc(1, 1, 10, 10, 60, 160);
             }
             else if (rollover) {
                 g.setColor(MetalLookAndFeel.getPrimaryControl());
-                g.fillRect(4, 1, 4, 2);
-                g.fillRect(8, 2, 2, 2);
-                g.fillRect(9, 4, 2, 4);
-                g.fillRect(8, 8, 2, 2);
-                g.fillRect(4, 9, 4, 2);
-                g.fillRect(2, 8, 2, 2);
-                g.fillRect(1, 4, 2, 4);
-                g.fillRect(2, 2, 2, 2);
+                g.drawOval(2, 2, 7, 7);
             }
 
             // selected dot
@@ -1341,11 +1316,7 @@ public class MetalIconFactory implements Serializable {
                 } else {
                     g.setColor(MetalLookAndFeel.getControlDarkShadow());
                 }
-                g.fillRect( 4, 4,  4, 4);
-                g.drawLine( 4, 3,  7, 3);
-                g.drawLine( 8, 4,  8, 7);
-                g.drawLine( 7, 8,  4, 8);
-                g.drawLine( 3, 7,  3, 4);
+                g.fillOval(2, 2, 7, 7);
             }
 
             g.translate(-x, -y);
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
index 31a874326b1..13553acda46 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
@@ -128,9 +128,10 @@ public class MetalScrollButton extends BasicArrowButton
                 int startY = ((h+1) - arrowHeight) / 2;
                 int startX = (w / 2);
 
-                for (int line = 0; line < arrowHeight; line++) {
-                    g.drawLine( startX-line, startY+line, startX +line+1, startY+line);
-                }
+                g.translate(startX, startY);
+                g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+                              new int[]{0, 0, arrowHeight, arrowHeight}, 4);
+                g.translate(-startX, -startY);
 
                 if (isEnabled) {
                     g.setColor( highlightColor );
@@ -174,10 +175,10 @@ public class MetalScrollButton extends BasicArrowButton
 
                 int startY = (((h+1) - arrowHeight) / 2)+ arrowHeight-1;
                 int startX = (w / 2);
-
-                for (int line = 0; line < arrowHeight; line++) {
-                    g.drawLine( startX-line, startY-line, startX +line+1, startY-line);
-                }
+                g.translate(startX, startY);
+                g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+                              new int[]{0, 0, -arrowHeight, -arrowHeight}, 4);
+                g.translate(-startX, -startY);
 
                 if (isEnabled) {
                     g.setColor( highlightColor );
@@ -220,9 +221,10 @@ public class MetalScrollButton extends BasicArrowButton
                 int startX = (((w+1) - arrowHeight) / 2) + arrowHeight-1;
                 int startY = (h / 2);
 
-                for (int line = 0; line < arrowHeight; line++) {
-                    g.drawLine( startX-line, startY-line, startX -line, startY+line+1);
-                }
+                g.translate(startX, startY);
+                g.fillPolygon(new int[]{0, 0, -arrowHeight, -arrowHeight},
+                              new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+                g.translate(-startX, -startY);
 
                 if (isEnabled) {
                     g.setColor( highlightColor );
@@ -262,10 +264,10 @@ public class MetalScrollButton extends BasicArrowButton
                 int startX = (((w+1) - arrowHeight) / 2);
                 int startY = (h / 2);
 
-
-                for (int line = 0; line < arrowHeight; line++) {
-                    g.drawLine( startX+line, startY-line, startX +line, startY+line+1);
-                }
+                g.translate(startX, startY);
+                g.fillPolygon(new int[]{0, 0, arrowHeight, arrowHeight},
+                              new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+                g.translate(-startX, -startY);
 
                 if (isEnabled) {
                     g.setColor( highlightColor );
diff --git a/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java
new file mode 100644
index 00000000000..6c6a4599a1f
--- /dev/null
+++ b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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 8160986
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main/manual MetalHiDPIIconsTest
+ */
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class MetalHiDPIIconsTest {
+
+    private static volatile boolean testResult = false;
+    private static volatile CountDownLatch countDownLatch;
+    private static final String INSTRUCTIONS = "INSTRUCTIONS:\n"
+            + "Verify that icons are painted smoothly for standard Swing UI controls.\n\n"
+            + "If the display does not support HiDPI mode press PASS.\n\n"
+            + "1. Run the SwingSet2 demo on HiDPI Display.\n"
+            + "2. Select Metal Look and Feel\n"
+            + "3. Check that the icons are painted smoothly on Swing UI controls like:\n"
+            + "  - JRadioButton\n"
+            + "  - JCheckBox\n"
+            + "  - JComboBox\n"
+            + "  - JScrollPane (vertical and horizontal scroll bars)\n"
+            + "and others...\n\n"
+            + "If so, press PASS, else press FAIL.\n";
+
+    public static void main(String args[]) throws Exception {
+        countDownLatch = new CountDownLatch(1);
+
+        SwingUtilities.invokeLater(MetalHiDPIIconsTest::createUI);
+        countDownLatch.await(15, TimeUnit.MINUTES);
+
+        if (!testResult) {
+            throw new RuntimeException("Test fails!");
+        }
+    }
+
+    private static void createUI() {
+
+        final JFrame mainFrame = new JFrame("Metal L&F icons test");
+        GridBagLayout layout = new GridBagLayout();
+        JPanel mainControlPanel = new JPanel(layout);
+        JPanel resultButtonPanel = new JPanel(layout);
+
+        GridBagConstraints gbc = new GridBagConstraints();
+
+        JTextArea instructionTextArea = new JTextArea();
+        instructionTextArea.setText(INSTRUCTIONS);
+        instructionTextArea.setEditable(false);
+        instructionTextArea.setBackground(Color.white);
+
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        gbc.fill = GridBagConstraints.HORIZONTAL;
+        mainControlPanel.add(instructionTextArea, gbc);
+
+        JButton passButton = new JButton("Pass");
+        passButton.setActionCommand("Pass");
+        passButton.addActionListener((ActionEvent e) -> {
+            testResult = true;
+            mainFrame.dispose();
+            countDownLatch.countDown();
+
+        });
+
+        JButton failButton = new JButton("Fail");
+        failButton.setActionCommand("Fail");
+        failButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                mainFrame.dispose();
+                countDownLatch.countDown();
+            }
+        });
+
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        resultButtonPanel.add(passButton, gbc);
+
+        gbc.gridx = 1;
+        gbc.gridy = 0;
+        resultButtonPanel.add(failButton, gbc);
+
+        gbc.gridx = 0;
+        gbc.gridy = 1;
+        mainControlPanel.add(resultButtonPanel, gbc);
+
+        mainFrame.add(mainControlPanel);
+        mainFrame.pack();
+
+        mainFrame.addWindowListener(new WindowAdapter() {
+
+            @Override
+            public void windowClosing(WindowEvent e) {
+                mainFrame.dispose();
+                countDownLatch.countDown();
+            }
+        });
+        mainFrame.setVisible(true);
+    }
+}

From 432e69e8fe992d67a3bc3df1b5b1672c993f1fdc Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko 
Date: Tue, 9 Aug 2016 14:16:44 +0300
Subject: [PATCH 040/115] 8160083:
 compiler.codecache.jmx.InitialAndMaxUsageTest can not be used w/ disabled
 SegmentedCodeCache

Reviewed-by: kvn
---
 .../codecache/jmx/InitialAndMaxUsageTest.java | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
index a0ca3a46b29..e96dc4713d9 100644
--- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
+++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
@@ -36,6 +36,11 @@
  *     -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
  *     -XX:+SegmentedCodeCache
  *     compiler.codecache.jmx.InitialAndMaxUsageTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ *     -XX:-MethodFlushing -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *     -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
+ *     -XX:-SegmentedCodeCache
+ *     compiler.codecache.jmx.InitialAndMaxUsageTest
  */
 
 package compiler.codecache.jmx;
@@ -70,10 +75,16 @@ public class InitialAndMaxUsageTest {
         }
     }
 
-    private void fillWithSize(long size, List blobs) {
+    private void fillWithSize(long size, List blobs, MemoryPoolMXBean bean) {
         long blob;
-        while ((blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id))
-                != 0L) {
+        /* Don't fill too much to have space for adapters. So, stop after crossing 95% and
+           don't allocate in case we'll cross 97% on next allocation. We can hit situation
+           like 94% -> (1 allocation) -> 100% otherwise. So, check if
+            is less than 97%, then allocate in case it is, then, stop
+           further allocations with given size in case  more than 95% */
+        while (((double) bean.getUsage().getUsed() + size <= (CACHE_USAGE_COEF + 0.02d)  * maxSize)
+                && (blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id)) != 0L
+                && ((double) bean.getUsage().getUsed() <= CACHE_USAGE_COEF * maxSize)) {
             blobs.add(blob);
         }
     }
@@ -96,7 +107,7 @@ public class InitialAndMaxUsageTest {
          optimization */
         try {
             for (int coef = 1000000; coef > 0; coef /= 10) {
-                fillWithSize(coef * minAllocationUnit, blobs);
+                fillWithSize(coef * minAllocationUnit, blobs, bean);
             }
             Asserts.assertGT((double) bean.getUsage().getUsed(),
                     CACHE_USAGE_COEF * maxSize, String.format("Unable to fill "

From dfce7d89bfd36ef8c758fa0068c4533494784b06 Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko 
Date: Tue, 9 Aug 2016 14:17:28 +0300
Subject: [PATCH 041/115] 8163366:
 compiler/codecache/jmx/ThresholdNotificationsTest.java doesn't set
 -XX:+UnlockDiagnosticVMOptions while using WB

Reviewed-by: kvn
---
 .../compiler/codecache/jmx/ThresholdNotificationsTest.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
index bd22973fe4e..e173fc8a6c7 100644
--- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
+++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
@@ -31,11 +31,11 @@
  * @build compiler.codecache.jmx.ThresholdNotificationsTest
  * @run driver ClassFileInstaller sun.hotspot.WhiteBox
  *                                sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
  *     -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
  *     -XX:+SegmentedCodeCache
  *     compiler.codecache.jmx.ThresholdNotificationsTest
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
  *     -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
  *     -XX:-SegmentedCodeCache
  *     compiler.codecache.jmx.ThresholdNotificationsTest

From 5ae0aff787b6575be66a9d8c3af23b3a1c375f60 Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko 
Date: Tue, 9 Aug 2016 16:47:47 +0300
Subject: [PATCH 042/115] 8160299: Test8015436 doesn't check which method was
 executed

Reviewed-by: kvn
---
 .../runtime/cr8015436/Driver8015436.java      | 43 +++++++++++++++++++
 .../runtime/cr8015436/Test8015436.java        | 18 +++++---
 2 files changed, 56 insertions(+), 5 deletions(-)
 create mode 100644 hotspot/test/compiler/runtime/cr8015436/Driver8015436.java

diff --git a/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java b/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java
new file mode 100644
index 00000000000..79c4eb8971a
--- /dev/null
+++ b/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java
@@ -0,0 +1,43 @@
+/*
+ * 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 compiler.runtime.cr8015436;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+public class Driver8015436 {
+    public static void main(String args[]) {
+        OutputAnalyzer oa;
+        try {
+            oa = ProcessTools.executeProcess(ProcessTools.createJavaProcessBuilder(
+                    /* add test vm options */ true, Test8015436.class.getName()));
+        } catch (Exception ex) {
+            throw new Error("TESTBUG: exception while running child process: " + ex, ex);
+        }
+        oa.shouldHaveExitValue(0);
+        oa.shouldContain(Test8015436.SOME_MTD_INVOKED);
+        oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_DIRECTLY);
+        oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_MH);
+    }
+}
diff --git a/hotspot/test/compiler/runtime/cr8015436/Test8015436.java b/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
index 8c70624f32a..256f352b87e 100644
--- a/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
+++ b/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
@@ -25,8 +25,12 @@
  * @test
  * @bug 8015436
  * @summary the IK _initial_method_idnum value must be adjusted if overpass methods are added
+ * @library /test/lib/share/classes /
+ * @modules java.base/jdk.internal.misc
+ * @build compiler.runtime.cr8015436.Test8015436
+ *        compiler.runtime.cr8015436.Driver8015436
  *
- * @run main compiler.runtime.cr8015436.Test8015436
+ * @run driver compiler.runtime.cr8015436.Driver8015436
  */
 
 /*
@@ -45,20 +49,24 @@ import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
 
 public class Test8015436 implements InterfaceWithDefaultMethod {
+    public static final String SOME_MTD_INVOKED = "someMethod() invoked";
+    public static final String DEFAULT_MTD_INVOKED_DIRECTLY = "defaultMethod() invoked directly";
+    public static final String DEFAULT_MTD_INVOKED_MH = "defaultMethod() invoked via a MethodHandle";
+
     @Override
     public void someMethod() {
-        System.out.println("someMethod() invoked");
+        System.out.println(SOME_MTD_INVOKED);
     }
 
     public static void main(String[] args) throws Throwable {
         Test8015436 testObj = new Test8015436();
         testObj.someMethod();
-        testObj.defaultMethod("invoked directly");
+        testObj.defaultMethod(DEFAULT_MTD_INVOKED_DIRECTLY);
 
         MethodHandles.Lookup lookup = MethodHandles.lookup();
         MethodType   mt = MethodType.methodType(void.class, String.class);
         MethodHandle mh = lookup.findVirtual(Test8015436.class, "defaultMethod", mt);
-        mh.invokeExact(testObj, "invoked via a MethodHandle");
+        mh.invokeExact(testObj, DEFAULT_MTD_INVOKED_MH);
     }
 }
 
@@ -66,7 +74,7 @@ interface InterfaceWithDefaultMethod {
     public void someMethod();
 
     default public void defaultMethod(String str){
-        System.out.println("defaultMethod() " + str);
+        System.out.println(str);
     }
 }
 /*

From 85d6f6505de3d40403034d7fbef3c8c6bccca453 Mon Sep 17 00:00:00 2001
From: Robbin Ehn 
Date: Wed, 10 Aug 2016 09:24:42 +0200
Subject: [PATCH 043/115] 8161026: GPL header missing comma in year

Reviewed-by: sjohanss, redestad
---
 hotspot/src/share/vm/logging/logTagSet.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hotspot/src/share/vm/logging/logTagSet.hpp b/hotspot/src/share/vm/logging/logTagSet.hpp
index 0b238b32b52..a40ed5175bc 100644
--- a/hotspot/src/share/vm/logging/logTagSet.hpp
+++ b/hotspot/src/share/vm/logging/logTagSet.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016 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

From 942ee05da56559711221b2dbefed306e40a81283 Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga 
Date: Wed, 10 Aug 2016 21:02:14 -0400
Subject: [PATCH 044/115] 8163580: Cannot get Monitor Cache Dump in HSDB

Reviewed-by: dholmes
---
 hotspot/src/share/vm/runtime/vmStructs.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index a0687534eb3..34b48c3cf80 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -2643,7 +2643,7 @@ typedef CompactHashtable       SymbolCompactHashTable;
   /* DEFAULT_CACHE_LINE_SIZE (globalDefinitions.hpp) */                   \
   /***************************************************/                   \
                                                                           \
-  declare_constant(DEFAULT_CACHE_LINE_SIZE)                               \
+  declare_preprocessor_constant("DEFAULT_CACHE_LINE_SIZE", DEFAULT_CACHE_LINE_SIZE) \
                                                                           \
   declare_constant(Deoptimization::Unpack_deopt)                          \
   declare_constant(Deoptimization::Unpack_exception)                      \

From 17c7042e607522450c4dd3e068abab28acf65a06 Mon Sep 17 00:00:00 2001
From: Jini George 
Date: Thu, 11 Aug 2016 17:47:25 +0300
Subject: [PATCH 045/115] 8163143: illegal bci error with interpreted frames in
 SA due to mirror being stored in interpreted frames

Added code to represent the frame mirror offset in SA

Reviewed-by: dsamersoff
---
 .../classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java   | 4 ++--
 .../classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java   | 6 +-----
 .../share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java | 5 +++--
 3 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
index 5937f7f19a2..49849f9240c 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
@@ -46,7 +46,6 @@ public class PPC64Frame extends Frame {
   private static final int SENDER_SP_OFFSET           =  0;
 
   // Interpreter frames
-  private static final int INTERPRETER_FRAME_MIRROR_OFFSET = -3; // for native calls only
   private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
   private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
   private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
@@ -55,7 +54,8 @@ public class PPC64Frame extends Frame {
   private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
   private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
   private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
-  private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+  private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+  private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
   private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
   private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
   private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
index bbb1dfa7e44..afa4660691f 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
@@ -714,11 +714,7 @@ public class SPARCFrame extends Frame {
   /** 2 words, also used to save float regs across  calls to C */
   public static final int INTERPRETER_FRAME_D_SCRATCH_FP_OFFSET           = -2;
   public static final int INTERPRETER_FRAME_L_SCRATCH_FP_OFFSET           = -4;
-  /** For native calls only */
-  public static final int INTERPRETER_FRAME_PADDING_OFFSET                = -5;
-  /** For native calls only */
-  public static final int INTERPRETER_FRAME_MIRROR_OFFSET                 = -6;
-  /** Should be same as above, and should be zero mod 8 */
+  public static final int INTERPRETER_FRAME_MIRROR_OFFSET                 = -5;
   public static final int INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET           = -6;
   public static final int INTERPRETER_FRAME_VM_LOCAL_WORDS                = -INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET;
 
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
index 51e2b6e8089..65488fe96c6 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
@@ -48,10 +48,10 @@ public class X86Frame extends Frame {
   private static final int SENDER_SP_OFFSET           =  2;
 
   // Interpreter frames
-  private static final int INTERPRETER_FRAME_MIRROR_OFFSET    =  2; // for native calls only
   private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
   private static final int INTERPRETER_FRAME_LAST_SP_OFFSET   = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
   private static final int INTERPRETER_FRAME_METHOD_OFFSET    = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
+  private static       int INTERPRETER_FRAME_MIRROR_OFFSET;
   private static       int INTERPRETER_FRAME_MDX_OFFSET;         // Non-core builds only
   private static       int INTERPRETER_FRAME_CACHE_OFFSET;
   private static       int INTERPRETER_FRAME_LOCALS_OFFSET;
@@ -74,7 +74,8 @@ public class X86Frame extends Frame {
   }
 
   private static synchronized void initialize(TypeDataBase db) {
-    INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+    INTERPRETER_FRAME_MIRROR_OFFSET               = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+    INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
     INTERPRETER_FRAME_CACHE_OFFSET                = INTERPRETER_FRAME_MDX_OFFSET - 1;
     INTERPRETER_FRAME_LOCALS_OFFSET               = INTERPRETER_FRAME_CACHE_OFFSET - 1;
     INTERPRETER_FRAME_BCX_OFFSET                  = INTERPRETER_FRAME_LOCALS_OFFSET - 1;

From 2579620b6d4fdf7890372e0439feccda988b82ae Mon Sep 17 00:00:00 2001
From: Lois Foltan 
Date: Thu, 11 Aug 2016 11:41:11 -0400
Subject: [PATCH 046/115] 8162553: Crash in class unloading due to null CLD
 having a zero _keep_alive value

Correct the refcounting of ClassLoaderData::_keep_alive for anonymous classes.

Reviewed-by: acorn, coleenp, dholmes, jiangli
---
 hotspot/src/share/vm/classfile/classLoaderData.cpp | 12 ++++++++----
 hotspot/src/share/vm/classfile/classLoaderData.hpp |  8 +++++---
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp
index f31b1d0886c..09ddbf40b92 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp
@@ -126,13 +126,17 @@ bool ClassLoaderData::claim() {
 // ClassLoaderData, no other non-GC thread has knowledge of the anonymous class while
 // it is being defined, therefore _keep_alive is not volatile or atomic.
 void ClassLoaderData::inc_keep_alive() {
-  assert(_keep_alive >= 0, "Invalid keep alive count");
-  _keep_alive++;
+  if (is_anonymous()) {
+    assert(_keep_alive >= 0, "Invalid keep alive increment count");
+    _keep_alive++;
+  }
 }
 
 void ClassLoaderData::dec_keep_alive() {
-  assert(_keep_alive > 0, "Invalid keep alive count");
-  _keep_alive--;
+  if (is_anonymous()) {
+    assert(_keep_alive > 0, "Invalid keep alive decrement count");
+    _keep_alive--;
+  }
 }
 
 void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.hpp b/hotspot/src/share/vm/classfile/classLoaderData.hpp
index 602097935cc..e1798d349ad 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp
@@ -176,9 +176,9 @@ class ClassLoaderData : public CHeapObj {
   Mutex* _metaspace_lock;  // Locks the metaspace for allocations and setup.
   bool _unloading;         // true if this class loader goes away
   bool _is_anonymous;      // if this CLD is for an anonymous class
-  int _keep_alive;         // if this CLD is kept alive without a keep_alive_object().
-                           // Currently used solely for anonymous classes.
-                           // _keep_alive does not need to be volatile or
+  s2 _keep_alive;          // if this CLD is kept alive without a keep_alive_object().
+                           // Used for anonymous classes and the boot class
+                           // loader. _keep_alive does not need to be volatile or
                            // atomic since there is one unique CLD per anonymous class.
   volatile int _claimed;   // true if claimed, for example during GC traces.
                            // To avoid applying oop closure more than once.
@@ -289,6 +289,8 @@ class ClassLoaderData : public CHeapObj {
     return _unloading;
   }
 
+  // Used to refcount an anonymous class's CLD in order to
+  // indicate their aliveness without a keep_alive_object().
   void inc_keep_alive();
   void dec_keep_alive();
 

From 74e840d64cd4e68584211af5505ed3202ba116cc Mon Sep 17 00:00:00 2001
From: David Holmes 
Date: Fri, 12 Aug 2016 00:19:44 -0400
Subject: [PATCH 047/115] 8159461: bigapps/Kitchensink/stressExitCode hits
 assert: Must be VMThread or JavaThread

Reviewed-by: fparain, simonis, dcubed
---
 hotspot/src/os/aix/vm/os_aix.cpp        | 20 +++++++++++++++++---
 hotspot/src/os/bsd/vm/os_bsd.cpp        | 20 +++++++++++++++++---
 hotspot/src/os/linux/vm/os_linux.cpp    | 17 +++++++++++++++--
 hotspot/src/share/vm/runtime/thread.cpp |  7 +++++--
 4 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 42aa1a635a9..dffad2b7f3f 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -2686,7 +2686,8 @@ void os::hint_no_preempt() {}
 //      - sets target osthread state to continue
 //      - sends signal to end the sigsuspend loop in the SR_handler
 //
-//  Note that the SR_lock plays no role in this suspend/resume protocol.
+//  Note that the SR_lock plays no role in this suspend/resume protocol,
+//  but is checked for NULL in SR_handler as a thread termination indicator.
 //
 
 static void resume_clear_context(OSThread *osthread) {
@@ -2718,10 +2719,23 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
   // after sigsuspend.
   int old_errno = errno;
 
-  Thread* thread = Thread::current();
-  OSThread* osthread = thread->osthread();
+  Thread* thread = Thread::current_or_null_safe();
+  assert(thread != NULL, "Missing current thread in SR_handler");
+
+  // On some systems we have seen signal delivery get "stuck" until the signal
+  // mask is changed as part of thread termination. Check that the current thread
+  // has not already terminated (via SR_lock()) - else the following assertion
+  // will fail because the thread is no longer a JavaThread as the ~JavaThread
+  // destructor has completed.
+
+  if (thread->SR_lock() == NULL) {
+    return;
+  }
+
   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
 
+  OSThread* osthread = thread->osthread();
+
   os::SuspendResume::State current = osthread->sr.state();
   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
     suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index 738144baf3b..a40175df89c 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -2716,7 +2716,8 @@ void os::hint_no_preempt() {}
 //      - sets target osthread state to continue
 //      - sends signal to end the sigsuspend loop in the SR_handler
 //
-//  Note that the SR_lock plays no role in this suspend/resume protocol.
+//  Note that the SR_lock plays no role in this suspend/resume protocol,
+//  but is checked for NULL in SR_handler as a thread termination indicator.
 
 static void resume_clear_context(OSThread *osthread) {
   osthread->set_ucontext(NULL);
@@ -2746,10 +2747,23 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
   // after sigsuspend.
   int old_errno = errno;
 
-  Thread* thread = Thread::current();
-  OSThread* osthread = thread->osthread();
+  Thread* thread = Thread::current_or_null_safe();
+  assert(thread != NULL, "Missing current thread in SR_handler");
+
+  // On some systems we have seen signal delivery get "stuck" until the signal
+  // mask is changed as part of thread termination. Check that the current thread
+  // has not already terminated (via SR_lock()) - else the following assertion
+  // will fail because the thread is no longer a JavaThread as the ~JavaThread
+  // destructor has completed.
+
+  if (thread->SR_lock() == NULL) {
+    return;
+  }
+
   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
 
+  OSThread* osthread = thread->osthread();
+
   os::SuspendResume::State current = osthread->sr.state();
   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
     suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index b8c1a72ae4a..5f4f1174c9d 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -3971,7 +3971,8 @@ void os::hint_no_preempt() {}
 //      - sets target osthread state to continue
 //      - sends signal to end the sigsuspend loop in the SR_handler
 //
-//  Note that the SR_lock plays no role in this suspend/resume protocol.
+//  Note that the SR_lock plays no role in this suspend/resume protocol,
+//  but is checked for NULL in SR_handler as a thread termination indicator.
 
 static void resume_clear_context(OSThread *osthread) {
   osthread->set_ucontext(NULL);
@@ -4004,9 +4005,21 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
 
   Thread* thread = Thread::current_or_null_safe();
   assert(thread != NULL, "Missing current thread in SR_handler");
-  OSThread* osthread = thread->osthread();
+
+  // On some systems we have seen signal delivery get "stuck" until the signal
+  // mask is changed as part of thread termination. Check that the current thread
+  // has not already terminated (via SR_lock()) - else the following assertion
+  // will fail because the thread is no longer a JavaThread as the ~JavaThread
+  // destructor has completed.
+
+  if (thread->SR_lock() == NULL) {
+    return;
+  }
+
   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
 
+  OSThread* osthread = thread->osthread();
+
   os::SuspendResume::State current = osthread->sr.state();
   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
     suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp
index 26c7e870d07..c87de622492 100644
--- a/hotspot/src/share/vm/runtime/thread.cpp
+++ b/hotspot/src/share/vm/runtime/thread.cpp
@@ -374,11 +374,14 @@ Thread::~Thread() {
   delete handle_area();
   delete metadata_handles();
 
+  // SR_handler uses this as a termination indicator -
+  // needs to happen before os::free_thread()
+  delete _SR_lock;
+  _SR_lock = NULL;
+
   // osthread() can be NULL, if creation of thread failed.
   if (osthread() != NULL) os::free_thread(osthread());
 
-  delete _SR_lock;
-
   // clear Thread::current if thread is deleting itself.
   // Needed to ensure JNI correctly detects non-attached threads.
   if (this == Thread::current()) {

From 90db0f9ad78c03fd2f720b6771345db02883fc64 Mon Sep 17 00:00:00 2001
From: Frederic Parain 
Date: Fri, 12 Aug 2016 08:46:17 -0700
Subject: [PATCH 048/115] 8146697: VM crashes in test Test7005594

Reviewed-by: coleenp, dholmes
---
 hotspot/src/cpu/x86/vm/interp_masm_x86.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
index 15cf1f751a7..f3ae96f05a1 100644
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
@@ -1071,6 +1071,9 @@ void InterpreterMacroAssembler::remove_activation(
 
     NOT_LP64(get_thread(rthread);)
 
+    cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
+    jcc(Assembler::equal, no_reserved_zone_enabling);
+
     cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
     jcc(Assembler::lessEqual, no_reserved_zone_enabling);
 

From d68c6f28d46e620c1d1b088c40309cab3456e816 Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga 
Date: Tue, 9 Aug 2016 21:57:29 +0900
Subject: [PATCH 049/115] 8163185: jhsdb jstack cannot work with normal mode

Reviewed-by: dsamersoff, dholmes
---
 .../share/classes/sun/jvm/hotspot/SALauncher.java              | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
index 8513c109bb6..3d4c2db9362 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
@@ -255,7 +255,8 @@ public class SALauncher {
         }
 
         buildAttachArgs(newArgs, pid, exe, core, false);
-        JStack.main(newArgs.toArray(new String[newArgs.size()]));
+        JStack jstack = new JStack(false, false);
+        jstack.runWithArgs(newArgs.toArray(new String[newArgs.size()]));
     }
 
     private static void runJMAP(String[] oldArgs) {

From 9797ce7dcb2ab2c0fb05f6a5287222db719abad4 Mon Sep 17 00:00:00 2001
From: Phil Race 
Date: Tue, 9 Aug 2016 16:20:02 -0700
Subject: [PATCH 050/115] 8163238: Upgrade to harfbuzz 1.3.0 in JDK 9

Reviewed-by: vadim, serb
---
 .../native/libfontmanager/harfbuzz/hb-blob.cc |    1 -
 .../native/libfontmanager/harfbuzz/hb-blob.h  |   24 +-
 .../harfbuzz/hb-buffer-private.hh             |  114 +-
 .../harfbuzz/hb-buffer-serialize.cc           |   86 +-
 .../libfontmanager/harfbuzz/hb-buffer.cc      |  457 +-
 .../libfontmanager/harfbuzz/hb-buffer.h       |  254 +-
 .../libfontmanager/harfbuzz/hb-common.cc      |   48 +-
 .../libfontmanager/harfbuzz/hb-common.h       |   47 +-
 .../libfontmanager/harfbuzz/hb-coretext.cc    |  207 +-
 .../libfontmanager/harfbuzz/hb-coretext.h     |    6 +-
 .../libfontmanager/harfbuzz/hb-deprecated.h   |   10 +
 .../native/libfontmanager/harfbuzz/hb-face.h  |   34 +-
 .../harfbuzz/hb-fallback-shape.cc             |    4 +-
 .../harfbuzz/hb-font-private.hh               |  217 +-
 .../native/libfontmanager/harfbuzz/hb-font.cc |  567 +-
 .../native/libfontmanager/harfbuzz/hb-font.h  |  241 +-
 .../native/libfontmanager/harfbuzz/hb-ft.cc   |  172 +-
 .../native/libfontmanager/harfbuzz/hb-ft.h    |   18 +-
 .../harfbuzz/hb-open-file-private.hh          |    4 +-
 .../harfbuzz/hb-open-type-private.hh          |   45 +-
 .../harfbuzz/hb-ot-cmap-table.hh              |  125 +-
 .../libfontmanager/harfbuzz/hb-ot-font.cc     |  365 +-
 .../libfontmanager/harfbuzz/hb-ot-font.h      |    2 +-
 .../harfbuzz/hb-ot-glyf-table.hh              |    8 +-
 .../harfbuzz/hb-ot-head-table.hh              |    8 +-
 .../harfbuzz/hb-ot-hhea-table.hh              |    2 +-
 .../harfbuzz/hb-ot-hmtx-table.hh              |    6 +-
 .../harfbuzz/hb-ot-layout-common-private.hh   |   54 +-
 .../harfbuzz/hb-ot-layout-gdef-table.hh       |    2 +-
 .../harfbuzz/hb-ot-layout-gpos-table.hh       |  136 +-
 .../harfbuzz/hb-ot-layout-gsub-table.hh       |   49 +-
 .../harfbuzz/hb-ot-layout-gsubgpos-private.hh |   63 +-
 .../harfbuzz/hb-ot-layout-jstf-table.hh       |    2 +-
 .../harfbuzz/hb-ot-layout-private.hh          |  205 +-
 .../libfontmanager/harfbuzz/hb-ot-layout.cc   |  248 +-
 .../libfontmanager/harfbuzz/hb-ot-layout.h    |   56 +-
 .../harfbuzz/hb-ot-map-private.hh             |   19 +-
 .../libfontmanager/harfbuzz/hb-ot-map.cc      |    7 +-
 .../harfbuzz/hb-ot-maxp-table.hh              |    2 +-
 .../harfbuzz/hb-ot-os2-table.hh               |  105 +
 .../hb-ot-shape-complex-arabic-table.hh       |   56 +-
 .../harfbuzz/hb-ot-shape-complex-arabic.cc    |  248 +-
 .../harfbuzz/hb-ot-shape-complex-default.cc   |    3 +-
 .../harfbuzz/hb-ot-shape-complex-hangul.cc    |    9 +-
 .../harfbuzz/hb-ot-shape-complex-hebrew.cc    |    3 +-
 .../hb-ot-shape-complex-indic-machine.hh      | 2026 ++++---
 .../hb-ot-shape-complex-indic-private.hh      |   45 +-
 .../hb-ot-shape-complex-indic-table.cc        |  698 +--
 .../harfbuzz/hb-ot-shape-complex-indic.cc     |  145 +-
 .../hb-ot-shape-complex-myanmar-machine.hh    |   38 +-
 .../harfbuzz/hb-ot-shape-complex-myanmar.cc   |   25 +-
 .../harfbuzz/hb-ot-shape-complex-private.hh   |   29 +-
 .../harfbuzz/hb-ot-shape-complex-thai.cc      |    8 +-
 .../harfbuzz/hb-ot-shape-complex-tibetan.cc   |    3 +-
 .../hb-ot-shape-complex-use-machine.hh        |  588 +-
 .../hb-ot-shape-complex-use-private.hh        |    1 -
 .../harfbuzz/hb-ot-shape-complex-use-table.cc |  224 +-
 .../harfbuzz/hb-ot-shape-complex-use.cc       |   65 +-
 .../harfbuzz/hb-ot-shape-fallback-private.hh  |    4 +
 .../harfbuzz/hb-ot-shape-fallback.cc          |   71 +-
 .../harfbuzz/hb-ot-shape-normalize.cc         |  117 +-
 .../libfontmanager/harfbuzz/hb-ot-shape.cc    |  186 +-
 .../libfontmanager/harfbuzz/hb-ot-shape.h     |    4 +-
 .../libfontmanager/harfbuzz/hb-ot-tag.cc      |  166 +-
 .../libfontmanager/harfbuzz/hb-ot-tag.h       |    8 +-
 .../libfontmanager/harfbuzz/hb-private.hh     |   76 +-
 .../native/libfontmanager/harfbuzz/hb-set.h   |   52 +-
 .../libfontmanager/harfbuzz/hb-shape-plan.h   |   18 +-
 .../libfontmanager/harfbuzz/hb-shape.cc       |   12 +-
 .../native/libfontmanager/harfbuzz/hb-shape.h |   10 +-
 .../libfontmanager/harfbuzz/hb-shaper-list.hh |    3 +
 .../native/libfontmanager/harfbuzz/hb-ucdn.cc |    6 +
 .../libfontmanager/harfbuzz/hb-ucdn/ucdn.c    |   80 +-
 .../libfontmanager/harfbuzz/hb-ucdn/ucdn.h    |   98 +-
 .../harfbuzz/hb-ucdn/unicodedata_db.h         | 4754 +++++++++--------
 .../harfbuzz/hb-unicode-private.hh            |   61 +-
 .../libfontmanager/harfbuzz/hb-unicode.h      |   71 +-
 .../libfontmanager/harfbuzz/hb-utf-private.hh |   46 +-
 .../libfontmanager/harfbuzz/hb-version.h      |   12 +-
 .../share/native/libfontmanager/harfbuzz/hb.h |    4 +
 80 files changed, 8085 insertions(+), 6008 deletions(-)
 create mode 100644 jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh

diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
index 40aa17f306c..5068dc14d9a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
@@ -104,7 +104,6 @@ hb_blob_create (const char        *data,
 
   if (!length ||
       length >= 1u << 31 ||
-      data + length < data /* overflows */ ||
       !(blob = hb_object_create ())) {
     if (destroy)
       destroy (user_data);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
index 6559ca2f407..ff44e18b76f 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
@@ -64,7 +64,7 @@ typedef enum {
 
 typedef struct hb_blob_t hb_blob_t;
 
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_blob_create (const char        *data,
                 unsigned int       length,
                 hb_memory_mode_t   mode,
@@ -77,21 +77,21 @@ hb_blob_create (const char        *data,
  * modify the parent data as that data may be
  * shared among multiple sub-blobs.
  */
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_blob_create_sub_blob (hb_blob_t    *parent,
                          unsigned int  offset,
                          unsigned int  length);
 
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_blob_get_empty (void);
 
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_blob_reference (hb_blob_t *blob);
 
-void
+HB_EXTERN void
 hb_blob_destroy (hb_blob_t *blob);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_blob_set_user_data (hb_blob_t          *blob,
                        hb_user_data_key_t *key,
                        void *              data,
@@ -99,25 +99,25 @@ hb_blob_set_user_data (hb_blob_t          *blob,
                        hb_bool_t           replace);
 
 
-void *
+HB_EXTERN void *
 hb_blob_get_user_data (hb_blob_t          *blob,
                        hb_user_data_key_t *key);
 
 
-void
+HB_EXTERN void
 hb_blob_make_immutable (hb_blob_t *blob);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_blob_is_immutable (hb_blob_t *blob);
 
 
-unsigned int
+HB_EXTERN unsigned int
 hb_blob_get_length (hb_blob_t *blob);
 
-const char *
+HB_EXTERN const char *
 hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
 
-char *
+HB_EXTERN char *
 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
index 8f0f1d6dd72..1fc2252d12c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
@@ -35,9 +35,36 @@
 #include "hb-unicode-private.hh"
 
 
+#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR
+#define HB_BUFFER_MAX_EXPANSION_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
+
 ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
 ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
 
+HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+
+enum hb_buffer_scratch_flags_t {
+  HB_BUFFER_SCRATCH_FLAG_DEFAULT                        = 0x00000000u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII                  = 0x00000001u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES         = 0x00000002u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK             = 0x00000004u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT            = 0x00000008u,
+  /* Reserved for complex shapers' internal use. */
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX0                       = 0x01000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX1                       = 0x02000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX2                       = 0x04000000u,
+  HB_BUFFER_SCRATCH_FLAG_COMPLEX3                       = 0x08000000u,
+};
+HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
+
 
 /*
  * hb_buffer_t
@@ -52,6 +79,8 @@ struct hb_buffer_t {
   hb_buffer_flags_t flags; /* BOT / EOT / etc. */
   hb_buffer_cluster_level_t cluster_level;
   hb_codepoint_t replacement; /* U+FFFD or something else. */
+  hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
+  unsigned int max_len; /* Maximum allowed len. */
 
   /* Buffer contents */
   hb_buffer_content_type_t content_type;
@@ -76,17 +105,13 @@ struct hb_buffer_t {
   inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
   inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
 
-  inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; }
-  inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; }
+  inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
+  inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
 
   inline bool has_separate_output (void) const { return info != out_info; }
 
   unsigned int serial;
 
-  /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
-  uint8_t allocated_var_bytes[8];
-  const char *allocated_var_owner[8];
-
   /* Text before / after the main buffer contents.
    * Always in Unicode, and ordered outward.
    * Index 0 is for "pre-context", 1 for "post-context". */
@@ -94,6 +119,52 @@ struct hb_buffer_t {
   hb_codepoint_t context[2][CONTEXT_LENGTH];
   unsigned int context_len[2];
 
+  /* Debugging API */
+  hb_buffer_message_func_t message_func;
+  void *message_data;
+  hb_destroy_func_t message_destroy;
+
+  /* Internal debugging. */
+  /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+#ifndef HB_NDEBUG
+  uint8_t allocated_var_bits;
+#endif
+  inline void allocate_var (unsigned int start, unsigned int count)
+  {
+#ifndef HB_NDEBUG
+    unsigned int end = start + count;
+    assert (end <= 8);
+    unsigned int bits = (1<func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
-           sizeof (b->info[0].var), owner)
-#define HB_BUFFER_ALLOCATE_VAR(b, var) \
-        HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var (), #var)
-#define HB_BUFFER_DEALLOCATE_VAR(b, var) \
-        HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var)
-#define HB_BUFFER_ASSERT_VAR(b, var) \
-        HB_BUFFER_XALLOCATE_VAR (b, assert_var, var (), #var)
+           sizeof (b->info[0].var))
+#define HB_BUFFER_ALLOCATE_VAR(b, var)          HB_BUFFER_XALLOCATE_VAR (b, allocate_var,   var ())
+#define HB_BUFFER_DEALLOCATE_VAR(b, var)        HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
+#define HB_BUFFER_ASSERT_VAR(b, var)            HB_BUFFER_XALLOCATE_VAR (b, assert_var,     var ())
 
 
 #endif /* HB_BUFFER_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
index 8da89bd3248..0047743d79e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
@@ -36,11 +36,12 @@ static const char *serialize_formats[] = {
 /**
  * hb_buffer_serialize_list_formats:
  *
- *
+ * Returns a list of supported buffer serialization formats.
  *
  * Return value: (transfer none):
+ * A string array of buffer serialization formats. Should not be freed.
  *
- * Since: 0.9.2
+ * Since: 0.9.7
  **/
 const char **
 hb_buffer_serialize_list_formats (void)
@@ -50,14 +51,17 @@ hb_buffer_serialize_list_formats (void)
 
 /**
  * hb_buffer_serialize_format_from_string:
- * @str:
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
  *
+ * Parses a string into an #hb_buffer_serialize_format_t. Does not check if
+ * @str is a valid buffer serialization format, use
+ * hb_buffer_serialize_list_formats() to get the list of supported formats.
  *
  * Return value:
+ * The parsed #hb_buffer_serialize_format_t.
  *
- * Since: 0.9.2
+ * Since: 0.9.7
  **/
 hb_buffer_serialize_format_t
 hb_buffer_serialize_format_from_string (const char *str, int len)
@@ -68,13 +72,15 @@ hb_buffer_serialize_format_from_string (const char *str, int len)
 
 /**
  * hb_buffer_serialize_format_to_string:
- * @format:
+ * @format: an #hb_buffer_serialize_format_t to convert.
  *
+ * Converts @format to the string corresponding it, or %NULL if it is not a valid
+ * #hb_buffer_serialize_format_t.
  *
+ * Return value: (transfer none):
+ * A %NULL terminated string corresponding to @format. Should not be freed.
  *
- * Return value:
- *
- * Since: 0.9.2
+ * Since: 0.9.7
  **/
 const char *
 hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
@@ -242,24 +248,51 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
   return end - start;
 }
 
-/* Returns number of items, starting at start, that were serialized. */
 /**
  * hb_buffer_serialize_glyphs:
- * @buffer: a buffer.
- * @start:
- * @end:
- * @buf: (array length=buf_size):
- * @buf_size:
- * @buf_consumed: (out):
- * @font:
- * @format:
- * @flags:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ *        read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
  *
+ * Serializes @buffer into a textual representation of its glyph content,
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
  *
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized glyphs will look something like:
+ *
+ * ```
+ * [uni0651=0@518,0+0|uni0628=0+1897]
+ * ```
+ * - The serialized glyphs are delimited with `[` and `]`.
+ * - Glyphs are separated with `|`
+ * - Each glyph starts with glyph name, or glyph index if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then,
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster.
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
+ *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
+ *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
+ *     #hb_glyph_extents_t in the format
+ *     `<x_bearing,y_bearing,width,height>`
+ *
+ * ## json
+ * TODO.
  *
  * Return value:
+ * The number of serialized items.
  *
- * Since: 0.9.2
+ * Since: 0.9.7
  **/
 unsigned int
 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
@@ -267,8 +300,8 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
                             unsigned int end,
                             char *buf,
                             unsigned int buf_size,
-                            unsigned int *buf_consumed, /* May be NULL */
-                            hb_font_t *font, /* May be NULL */
+                            unsigned int *buf_consumed,
+                            hb_font_t *font,
                             hb_buffer_serialize_format_t format,
                             hb_buffer_serialize_flags_t flags)
 {
@@ -282,6 +315,9 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
           buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
 
+  if (!buffer->have_positions)
+    flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+
   if (unlikely (start == end))
     return 0;
 
@@ -355,7 +391,7 @@ parse_int (const char *pp, const char *end, int32_t *pv)
 
 /**
  * hb_buffer_deserialize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t buffer.
  * @buf: (array length=buf_len):
  * @buf_len:
  * @end_ptr: (out):
@@ -366,7 +402,7 @@ parse_int (const char *pp, const char *end, int32_t *pv)
  *
  * Return value:
  *
- * Since: 0.9.2
+ * Since: 0.9.7
  **/
 hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
index 62177f3e9c8..aca21984fb7 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
@@ -35,8 +35,26 @@
 #define HB_DEBUG_BUFFER (HB_DEBUG+0)
 #endif
 
+/**
+ * SECTION: hb-buffer
+ * @title: Buffers
+ * @short_description: Input and output buffers
+ * @include: hb.h
+ *
+ * Buffers serve dual role in HarfBuzz; they hold the input characters that are
+ * passed hb_shape(), and after shaping they hold the output glyphs.
+ **/
 
 /**
+ * hb_segment_properties_equal:
+ * @a: first #hb_segment_properties_t to compare.
+ * @b: second #hb_segment_properties_t to compare.
+ *
+ * Checks the equality of two #hb_segment_properties_t's.
+ *
+ * Return value:
+ * %true if all properties of @a equal those of @b, false otherwise.
+ *
  * Since: 0.9.7
  **/
 hb_bool_t
@@ -52,6 +70,14 @@ hb_segment_properties_equal (const hb_segment_properties_t *a,
 }
 
 /**
+ * hb_segment_properties_hash:
+ * @p: #hb_segment_properties_t to hash.
+ *
+ * Creates a hash representing @p.
+ *
+ * Return value:
+ * A hash of @p.
+ *
  * Since: 0.9.7
  **/
 unsigned int
@@ -91,6 +117,11 @@ hb_buffer_t::enlarge (unsigned int size)
 {
   if (unlikely (in_error))
     return false;
+  if (unlikely (size > max_len))
+  {
+    in_error = true;
+    return false;
+  }
 
   unsigned int new_allocated = allocated;
   hb_glyph_position_t *new_pos = NULL;
@@ -152,6 +183,12 @@ hb_buffer_t::shift_forward (unsigned int count)
   if (unlikely (!ensure (len + count))) return false;
 
   memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0]));
+  if (idx + count > len)
+  {
+    /* Under memory failure we might expose this area.  At least
+     * clean it up.  Oh well... */
+    memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
+  }
   len += count;
   idx += count;
 
@@ -198,6 +235,7 @@ hb_buffer_t::clear (void)
 
   hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
   props = default_props;
+  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
 
   content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
   in_error = false;
@@ -210,11 +248,11 @@ hb_buffer_t::clear (void)
   out_info = info;
 
   serial = 0;
-  memset (allocated_var_bytes, 0, sizeof allocated_var_bytes);
-  memset (allocated_var_owner, 0, sizeof allocated_var_owner);
 
   memset (context, 0, sizeof context);
   memset (context_len, 0, sizeof context_len);
+
+  deallocate_var_all ();
 }
 
 void
@@ -375,6 +413,8 @@ hb_buffer_t::move_to (unsigned int i)
     idx = i;
     return true;
   }
+  if (unlikely (in_error))
+    return false;
 
   assert (i <= out_len + (len - idx));
 
@@ -392,6 +432,8 @@ hb_buffer_t::move_to (unsigned int i)
     /* Tricky part: rewinding... */
     unsigned int count = out_len - i;
 
+    /* This will blow in our face if memory allocation fails later
+     * in this same lookup... */
     if (unlikely (idx < count && !shift_forward (count + 32))) return false;
 
     assert (idx >= count);
@@ -627,82 +669,19 @@ hb_buffer_t::guess_segment_properties (void)
 }
 
 
-static inline void
-dump_var_allocation (const hb_buffer_t *buffer)
-{
-  char buf[80];
-  for (unsigned int i = 0; i < 8; i++)
-    buf[i] = '0' + buffer->allocated_var_bytes[7 - i];
-  buf[8] = '\0';
-  DEBUG_MSG (BUFFER, buffer,
-             "Current var allocation: %s",
-             buf);
-}
-
-void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
-  assert (byte_i < 8 && byte_i + count <= 8);
-
-  if (DEBUG_ENABLED (BUFFER))
-    dump_var_allocation (this);
-  DEBUG_MSG (BUFFER, this,
-             "Allocating var bytes %d..%d for %s",
-             byte_i, byte_i + count - 1, owner);
-
-  for (unsigned int i = byte_i; i < byte_i + count; i++) {
-    assert (!allocated_var_bytes[i]);
-    allocated_var_bytes[i]++;
-    allocated_var_owner[i] = owner;
-  }
-}
-
-void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
-  if (DEBUG_ENABLED (BUFFER))
-    dump_var_allocation (this);
-
-  DEBUG_MSG (BUFFER, this,
-             "Deallocating var bytes %d..%d for %s",
-             byte_i, byte_i + count - 1, owner);
-
-  assert (byte_i < 8 && byte_i + count <= 8);
-  for (unsigned int i = byte_i; i < byte_i + count; i++) {
-    assert (allocated_var_bytes[i]);
-    assert (0 == strcmp (allocated_var_owner[i], owner));
-    allocated_var_bytes[i]--;
-  }
-}
-
-void hb_buffer_t::assert_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
-  if (DEBUG_ENABLED (BUFFER))
-    dump_var_allocation (this);
-
-  DEBUG_MSG (BUFFER, this,
-             "Asserting var bytes %d..%d for %s",
-             byte_i, byte_i + count - 1, owner);
-
-  assert (byte_i < 8 && byte_i + count <= 8);
-  for (unsigned int i = byte_i; i < byte_i + count; i++) {
-    assert (allocated_var_bytes[i]);
-    assert (0 == strcmp (allocated_var_owner[i], owner));
-  }
-}
-
-void hb_buffer_t::deallocate_var_all (void)
-{
-  memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes));
-  memset (allocated_var_owner, 0, sizeof (allocated_var_owner));
-}
-
 /* Public API */
 
 /**
  * hb_buffer_create: (Xconstructor)
  *
+ * Creates a new #hb_buffer_t with all properties to defaults.
  *
- *
- * Return value: (transfer full)
+ * Return value: (transfer full):
+ * A newly allocated #hb_buffer_t with a reference count of 1. The initial
+ * reference count should be released with hb_buffer_destroy() when you are done
+ * using the #hb_buffer_t. This function never returns %NULL. If memory cannot
+ * be allocated, a special #hb_buffer_t object will be returned on which
+ * hb_buffer_allocation_successful() returns %false.
  *
  * Since: 0.9.2
  **/
@@ -714,6 +693,8 @@ hb_buffer_create (void)
   if (!(buffer = hb_object_create ()))
     return hb_buffer_get_empty ();
 
+  buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+
   buffer->reset ();
 
   return buffer;
@@ -738,6 +719,8 @@ hb_buffer_get_empty (void)
     HB_BUFFER_FLAG_DEFAULT,
     HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
     HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+    HB_BUFFER_SCRATCH_FLAG_DEFAULT,
+    HB_BUFFER_MAX_LEN_DEFAULT,
 
     HB_BUFFER_CONTENT_TYPE_INVALID,
     HB_SEGMENT_PROPERTIES_DEFAULT,
@@ -753,11 +736,13 @@ hb_buffer_get_empty (void)
 
 /**
  * hb_buffer_reference: (skip)
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * Increases the reference count on @buffer by one. This prevents @buffer from
+ * being destroyed until a matching call to hb_buffer_destroy() is made.
  *
  * Return value: (transfer full):
+ * The referenced #hb_buffer_t.
  *
  * Since: 0.9.2
  **/
@@ -769,9 +754,11 @@ hb_buffer_reference (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_destroy: (skip)
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * Deallocate the @buffer.
+ * Decreases the reference count on @buffer by one. If the result is zero, then
+ * @buffer and all associated resources are freed. See hb_buffer_reference().
  *
  * Since: 0.9.2
  **/
@@ -784,13 +771,15 @@ hb_buffer_destroy (hb_buffer_t *buffer)
 
   free (buffer->info);
   free (buffer->pos);
+  if (buffer->message_destroy)
+    buffer->message_destroy (buffer->message_data);
 
   free (buffer);
 }
 
 /**
  * hb_buffer_set_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @key:
  * @data:
  * @destroy:
@@ -814,7 +803,7 @@ hb_buffer_set_user_data (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_get_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @key:
  *
  *
@@ -833,10 +822,11 @@ hb_buffer_get_user_data (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_set_content_type:
- * @buffer: a buffer.
- * @content_type:
- *
+ * @buffer: an #hb_buffer_t.
+ * @content_type: the type of buffer contents to set
  *
+ * Sets the type of @buffer contents, buffers are either empty, contain
+ * characters (before shaping) or glyphs (the result of shaping).
  *
  * Since: 0.9.5
  **/
@@ -849,11 +839,12 @@ hb_buffer_set_content_type (hb_buffer_t              *buffer,
 
 /**
  * hb_buffer_get_content_type:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * see hb_buffer_set_content_type().
  *
  * Return value:
+ * The type of @buffer contents.
  *
  * Since: 0.9.5
  **/
@@ -866,7 +857,7 @@ hb_buffer_get_content_type (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @unicode_funcs:
  *
  *
@@ -891,7 +882,7 @@ hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_get_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  *
  *
@@ -907,10 +898,16 @@ hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer)
 
 /**
  * hb_buffer_set_direction:
- * @buffer: a buffer.
- * @direction:
- *
+ * @buffer: an #hb_buffer_t.
+ * @direction: the #hb_direction_t of the @buffer
  *
+ * Set the text flow direction of the buffer. No shaping can happen without
+ * setting @buffer direction, and it controls the visual direction for the
+ * output glyphs; for RTL direction the glyphs will be reversed. Many layout
+ * features depend on the proper setting of the direction, for example,
+ * reversing RTL text before shaping, then shaping with LTR direction is not
+ * the same as keeping the text in logical order and shaping with RTL
+ * direction.
  *
  * Since: 0.9.2
  **/
@@ -927,11 +924,12 @@ hb_buffer_set_direction (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_get_direction:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * See hb_buffer_set_direction()
  *
  * Return value:
+ * The direction of the @buffer.
  *
  * Since: 0.9.2
  **/
@@ -943,10 +941,18 @@ hb_buffer_get_direction (hb_buffer_t    *buffer)
 
 /**
  * hb_buffer_set_script:
- * @buffer: a buffer.
- * @script:
+ * @buffer: an #hb_buffer_t.
+ * @script: an #hb_script_t to set.
  *
+ * Sets the script of @buffer to @script.
  *
+ * Script is crucial for choosing the proper shaping behaviour for scripts that
+ * require it (e.g. Arabic) and the which OpenType features defined in the font
+ * to be applied.
+ *
+ * You can pass one of the predefined #hb_script_t values, or use
+ * hb_script_from_string() or hb_script_from_iso15924_tag() to get the
+ * corresponding script from an ISO 15924 script tag.
  *
  * Since: 0.9.2
  **/
@@ -962,11 +968,12 @@ hb_buffer_set_script (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_get_script:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * See hb_buffer_set_script().
  *
  * Return value:
+ * The #hb_script_t of the @buffer.
  *
  * Since: 0.9.2
  **/
@@ -978,10 +985,18 @@ hb_buffer_get_script (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_language:
- * @buffer: a buffer.
- * @language:
+ * @buffer: an #hb_buffer_t.
+ * @language: an hb_language_t to set.
  *
+ * Sets the language of @buffer to @language.
  *
+ * Languages are crucial for selecting which OpenType feature to apply to the
+ * buffer which can result in applying language-specific behaviour. Languages
+ * are orthogonal to the scripts, and though they are related, they are
+ * different concepts and should not be confused with each other.
+ *
+ * Use hb_language_from_string() to convert from ISO 639 language codes to
+ * #hb_language_t.
  *
  * Since: 0.9.2
  **/
@@ -997,11 +1012,12 @@ hb_buffer_set_language (hb_buffer_t   *buffer,
 
 /**
  * hb_buffer_get_language:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * See hb_buffer_set_language().
  *
  * Return value: (transfer none):
+ * The #hb_language_t of the buffer. Must not be freed by the caller.
  *
  * Since: 0.9.2
  **/
@@ -1013,10 +1029,12 @@ hb_buffer_get_language (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_segment_properties:
- * @buffer: a buffer.
- * @props:
- *
+ * @buffer: an #hb_buffer_t.
+ * @props: an #hb_segment_properties_t to use.
  *
+ * Sets the segment properties of the buffer, a shortcut for calling
+ * hb_buffer_set_direction(), hb_buffer_set_script() and
+ * hb_buffer_set_language() individually.
  *
  * Since: 0.9.7
  **/
@@ -1032,10 +1050,10 @@ hb_buffer_set_segment_properties (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_get_segment_properties:
- * @buffer: a buffer.
- * @props: (out):
- *
+ * @buffer: an #hb_buffer_t.
+ * @props: (out): the output #hb_segment_properties_t.
  *
+ * Sets @props to the #hb_segment_properties_t of @buffer.
  *
  * Since: 0.9.7
  **/
@@ -1049,10 +1067,10 @@ hb_buffer_get_segment_properties (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_set_flags:
- * @buffer: a buffer.
- * @flags:
- *
+ * @buffer: an #hb_buffer_t.
+ * @flags: the buffer flags to set.
  *
+ * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
  *
  * Since: 0.9.7
  **/
@@ -1068,11 +1086,12 @@ hb_buffer_set_flags (hb_buffer_t       *buffer,
 
 /**
  * hb_buffer_get_flags:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * See hb_buffer_set_flags().
  *
  * Return value:
+ * The @buffer flags.
  *
  * Since: 0.9.7
  **/
@@ -1084,7 +1103,7 @@ hb_buffer_get_flags (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @cluster_level:
  *
  *
@@ -1103,7 +1122,7 @@ hb_buffer_set_cluster_level (hb_buffer_t       *buffer,
 
 /**
  * hb_buffer_get_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  *
  *
@@ -1120,10 +1139,13 @@ hb_buffer_get_cluster_level (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_replacement_codepoint:
- * @buffer: a buffer.
- * @replacement:
+ * @buffer: an #hb_buffer_t.
+ * @replacement: the replacement #hb_codepoint_t
  *
+ * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
  *
+ * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
  *
  * Since: 0.9.31
  **/
@@ -1139,11 +1161,12 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_get_replacement_codepoint:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * See hb_buffer_set_replacement_codepoint().
  *
  * Return value:
+ * The @buffer replacement #hb_codepoint_t.
  *
  * Since: 0.9.31
  **/
@@ -1156,9 +1179,10 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer)
 
 /**
  * hb_buffer_reset:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * Resets the buffer to its initial status, as if it was just newly created
+ * with hb_buffer_create().
  *
  * Since: 0.9.2
  **/
@@ -1170,9 +1194,10 @@ hb_buffer_reset (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_clear_contents:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
+ * the replacement code point.
  *
  * Since: 0.9.11
  **/
@@ -1184,12 +1209,13 @@ hb_buffer_clear_contents (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_pre_allocate:
- * @buffer: a buffer.
- * @size:
- *
+ * @buffer: an #hb_buffer_t.
+ * @size: number of items to pre allocate.
  *
+ * Pre allocates memory for @buffer to fit at least @size number of items.
  *
  * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
  *
  * Since: 0.9.2
  **/
@@ -1201,11 +1227,12 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
 
 /**
  * hb_buffer_allocation_successful:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
  *
+ * Check if allocating memory for the buffer succeeded.
  *
  * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
  *
  * Since: 0.9.2
  **/
@@ -1217,11 +1244,18 @@ hb_buffer_allocation_successful (hb_buffer_t  *buffer)
 
 /**
  * hb_buffer_add:
- * @buffer: a buffer.
- * @codepoint:
- * @cluster:
+ * @buffer: an #hb_buffer_t.
+ * @codepoint: a Unicode code point.
+ * @cluster: the cluster value of @codepoint.
  *
+ * Appends a character with the Unicode value of @codepoint to @buffer, and
+ * gives it the initial cluster value of @cluster. Clusters can be any thing
+ * the client wants, they are usually used to refer to the index of the
+ * character in the input text stream and are output in
+ * #hb_glyph_info_t.cluster field.
  *
+ * This function does not check the validity of @codepoint, it is up to the
+ * caller to ensure it is a valid Unicode code point.
  *
  * Since: 0.9.7
  **/
@@ -1236,12 +1270,14 @@ hb_buffer_add (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_set_length:
- * @buffer: a buffer.
- * @length:
- *
+ * @buffer: an #hb_buffer_t.
+ * @length: the new length of @buffer.
  *
+ * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
+ * end.
  *
  * Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
  *
  * Since: 0.9.2
  **/
@@ -1276,11 +1312,13 @@ hb_buffer_set_length (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_get_length:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  * Returns the number of items in the buffer.
  *
- * Return value: buffer length.
+ * Return value:
+ * The @buffer length.
+ * The value valid as long as buffer has not been modified.
  *
  * Since: 0.9.2
  **/
@@ -1292,13 +1330,15 @@ hb_buffer_get_length (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_get_glyph_infos:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @length: (out): output array length.
  *
- * Returns buffer glyph information array.  Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph information array.  Returned pointer
+ * is valid as long as @buffer contents are not modified.
  *
- * Return value: (transfer none) (array length=length): buffer glyph information array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph information array.
+ * The value valid as long as buffer has not been modified.
  *
  * Since: 0.9.2
  **/
@@ -1314,13 +1354,15 @@ hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_get_glyph_positions:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @length: (out): output length.
  *
- * Returns buffer glyph position array.  Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph position array.  Returned pointer
+ * is valid as long as @buffer contents are not modified.
  *
- * Return value: (transfer none) (array length=length): buffer glyph position array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph position array.
+ * The value valid as long as buffer has not been modified.
  *
  * Since: 0.9.2
  **/
@@ -1339,7 +1381,7 @@ hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_reverse:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  * Reverses buffer contents.
  *
@@ -1353,7 +1395,7 @@ hb_buffer_reverse (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_reverse_range:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  * @start: start index.
  * @end: end index.
  *
@@ -1370,7 +1412,7 @@ hb_buffer_reverse_range (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_reverse_clusters:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  * Reverses buffer clusters.  That is, the buffer contents are
  * reversed, then each cluster (consecutive items having the
@@ -1386,7 +1428,7 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_guess_segment_properties:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
  * Sets unset buffer segment properties based on buffer Unicode
  * contents.  If buffer is not empty, it must have content type
@@ -1485,13 +1527,18 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_add_utf8:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ *               characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
  *
+ * See hb_buffer_add_codepoints().
  *
+ * Replaces invalid UTF-8 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
  *
  * Since: 0.9.2
  **/
@@ -1507,13 +1554,17 @@ hb_buffer_add_utf8 (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_add_utf16:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-16 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
  *
+ * See hb_buffer_add_codepoints().
  *
+ * Replaces invalid UTF-16 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
  *
  * Since: 0.9.2
  **/
@@ -1529,13 +1580,17 @@ hb_buffer_add_utf16 (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_add_utf32:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-32 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
  *
+ * See hb_buffer_add_codepoints().
  *
+ * Replaces invalid UTF-32 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
  *
  * Since: 0.9.2
  **/
@@ -1551,13 +1606,18 @@ hb_buffer_add_utf32 (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_add_latin1:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ *               characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
  *
+ * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
+ * Unicode code points that can fit in 8-bit strings.
  *
+ * Has nothing to do with non-Unicode Latin-1 encoding.
  *
  * Since: 0.9.39
  **/
@@ -1573,13 +1633,25 @@ hb_buffer_add_latin1 (hb_buffer_t   *buffer,
 
 /**
  * hb_buffer_add_codepoints:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: a #hb_buffer_t to append characters to.
+ * @text: (array length=text_length): an array of Unicode code points to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first code point to add to the @buffer.
+ * @item_length: the number of code points to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated).
  *
+ * Appends characters from @text array to @buffer. The @item_offset is the
+ * position of the first character from @text that will be appended, and
+ * @item_length is the number of character. When shaping part of a larger text
+ * (e.g. a run of text from a paragraph), instead of passing just the substring
+ * corresponding to the run, it is preferable to pass the whole
+ * paragraph and specify the run start and length as @item_offset and
+ * @item_length, respectively, to give HarfBuzz the full context to be able,
+ * for example, to do cross-run Arabic shaping or properly handle combining
+ * marks at stat of run.
  *
+ * This function does not check the validity of @text, it is up to the caller
+ * to ensure it contains a valid Unicode code points.
  *
  * Since: 0.9.31
  **/
@@ -1651,9 +1723,12 @@ normalize_glyphs_cluster (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_normalize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
  *
+ * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
+ * The resulting clusters should behave identical to pre-reordering clusters.
  *
+ * This has nothing to do with Unicode normalization.
  *
  * Since: 0.9.2
  **/
@@ -1699,3 +1774,45 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g
     }
   }
 }
+
+/*
+ * Debugging.
+ */
+
+/**
+ * hb_buffer_set_message_func:
+ * @buffer: an #hb_buffer_t.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+                            hb_buffer_message_func_t func,
+                            void *user_data, hb_destroy_func_t destroy)
+{
+  if (buffer->message_destroy)
+    buffer->message_destroy (buffer->message_data);
+
+  if (func) {
+    buffer->message_func = func;
+    buffer->message_data = user_data;
+    buffer->message_destroy = destroy;
+  } else {
+    buffer->message_func = NULL;
+    buffer->message_data = NULL;
+    buffer->message_destroy = NULL;
+  }
+}
+
+bool
+hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
+{
+  char buf[100];
+  vsnprintf (buf, sizeof (buf),  fmt, ap);
+  return (bool) this->message_func (this, font, buf, this->message_data);
+}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
index 5e56da49355..688e809779c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
@@ -40,7 +40,27 @@
 
 HB_BEGIN_DECLS
 
-
+/**
+ * hb_glyph_info_t:
+ * @codepoint: either a Unicode code point (before shaping) or a glyph index
+ *             (after shaping).
+ * @mask:
+ * @cluster: the index of the character in the original text that corresponds
+ *           to this #hb_glyph_info_t, or whatever the client passes to
+ *           hb_buffer_add(). More than one #hb_glyph_info_t can have the same
+ *           @cluster value, if they resulted from the same character (e.g. one
+ *           to many glyph substitution), and when more than one character gets
+ *           merged in the same glyph (e.g. many to one glyph substitution) the
+ *           #hb_glyph_info_t will have the smallest cluster value of them.
+ *           By default some characters are merged into the same cluster
+ *           (e.g. combining marks have the same cluster as their bases)
+ *           even if they are separate glyphs, hb_buffer_set_cluster_level()
+ *           allow selecting more fine-grained cluster handling.
+ *
+ * The #hb_glyph_info_t is the structure that holds information about the
+ * glyphs and their relation to input text.
+ *
+ */
 typedef struct hb_glyph_info_t {
   hb_codepoint_t codepoint;
   hb_mask_t      mask;
@@ -51,6 +71,22 @@ typedef struct hb_glyph_info_t {
   hb_var_int_t   var2;
 } hb_glyph_info_t;
 
+/**
+ * hb_glyph_position_t:
+ * @x_advance: how much the line advances after drawing this glyph when setting
+ *             text in horizontal direction.
+ * @y_advance: how much the line advances after drawing this glyph when setting
+ *             text in vertical direction.
+ * @x_offset: how much the glyph moves on the X-axis before drawing it, this
+ *            should not affect how much the line advances.
+ * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
+ *            should not affect how much the line advances.
+ *
+ * The #hb_glyph_position_t is the structure that holds the positions of the
+ * glyph in both horizontal and vertical directions. All positions in
+ * #hb_glyph_position_t are relative to the current point.
+ *
+ */
 typedef struct hb_glyph_position_t {
   hb_position_t  x_advance;
   hb_position_t  y_advance;
@@ -61,7 +97,16 @@ typedef struct hb_glyph_position_t {
   hb_var_int_t   var;
 } hb_glyph_position_t;
 
-
+/**
+ * hb_segment_properties_t:
+ * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
+ * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
+ * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
+ *
+ * The structure that holds various text properties of an #hb_buffer_t. Can be
+ * set and retrieved using hb_buffer_set_segment_properties() and
+ * hb_buffer_get_segment_properties(), respectively.
+ */
 typedef struct hb_segment_properties_t {
   hb_direction_t  direction;
   hb_script_t     script;
@@ -77,101 +122,125 @@ typedef struct hb_segment_properties_t {
                                        NULL, \
                                        NULL}
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_segment_properties_equal (const hb_segment_properties_t *a,
                              const hb_segment_properties_t *b);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_segment_properties_hash (const hb_segment_properties_t *p);
 
 
 
-/*
- * hb_buffer_t
+/**
+ * hb_buffer_t:
+ *
+ * The main structure holding the input text and its properties before shaping,
+ * and output glyphs and their information after shaping.
  */
 
 typedef struct hb_buffer_t hb_buffer_t;
 
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
 hb_buffer_create (void);
 
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
 hb_buffer_get_empty (void);
 
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
 hb_buffer_reference (hb_buffer_t *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_destroy (hb_buffer_t *buffer);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_buffer_set_user_data (hb_buffer_t        *buffer,
                          hb_user_data_key_t *key,
                          void *              data,
                          hb_destroy_func_t   destroy,
                          hb_bool_t           replace);
 
-void *
+HB_EXTERN void *
 hb_buffer_get_user_data (hb_buffer_t        *buffer,
                          hb_user_data_key_t *key);
 
-
+/**
+ * hb_buffer_content_type_t:
+ * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
+ * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
+ * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ */
 typedef enum {
   HB_BUFFER_CONTENT_TYPE_INVALID = 0,
   HB_BUFFER_CONTENT_TYPE_UNICODE,
   HB_BUFFER_CONTENT_TYPE_GLYPHS
 } hb_buffer_content_type_t;
 
-void
+HB_EXTERN void
 hb_buffer_set_content_type (hb_buffer_t              *buffer,
                             hb_buffer_content_type_t  content_type);
 
-hb_buffer_content_type_t
+HB_EXTERN hb_buffer_content_type_t
 hb_buffer_get_content_type (hb_buffer_t *buffer);
 
 
-void
+HB_EXTERN void
 hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
                              hb_unicode_funcs_t *unicode_funcs);
 
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_set_direction (hb_buffer_t    *buffer,
                          hb_direction_t  direction);
 
-hb_direction_t
+HB_EXTERN hb_direction_t
 hb_buffer_get_direction (hb_buffer_t *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_set_script (hb_buffer_t *buffer,
                       hb_script_t  script);
 
-hb_script_t
+HB_EXTERN hb_script_t
 hb_buffer_get_script (hb_buffer_t *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_set_language (hb_buffer_t   *buffer,
                         hb_language_t  language);
 
 
-hb_language_t
+HB_EXTERN hb_language_t
 hb_buffer_get_language (hb_buffer_t *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_set_segment_properties (hb_buffer_t *buffer,
                                   const hb_segment_properties_t *props);
 
-void
+HB_EXTERN void
 hb_buffer_get_segment_properties (hb_buffer_t *buffer,
                                   hb_segment_properties_t *props);
 
-void
+HB_EXTERN void
 hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
 
 
-/*
+/**
+ * hb_buffer_flags_t:
+ * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
+ * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
+ *                      of text paragraph can be applied to this buffer. Should usually
+ *                      be set, unless you are passing to the buffer only part
+ *                      of the text without the full context.
+ * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
+ *                      paragraph can be applied to this buffer, similar to
+ *                      @HB_BUFFER_FLAG_EOT.
+ * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
+ *                      flag indication that character with Default_Ignorable
+ *                      Unicode property should use the corresponding glyph
+ *                      from the font, instead of hiding them (currently done
+ *                      by replacing them with the space glyph and zeroing the
+ *                      advance width.)
+ *
  * Since: 0.9.20
  */
 typedef enum { /*< flags >*/
@@ -181,11 +250,11 @@ typedef enum { /*< flags >*/
   HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES    = 0x00000004u
 } hb_buffer_flags_t;
 
-void
+HB_EXTERN void
 hb_buffer_set_flags (hb_buffer_t       *buffer,
                      hb_buffer_flags_t  flags);
 
-hb_buffer_flags_t
+HB_EXTERN hb_buffer_flags_t
 hb_buffer_get_flags (hb_buffer_t *buffer);
 
 /*
@@ -198,93 +267,92 @@ typedef enum {
   HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
 } hb_buffer_cluster_level_t;
 
-void
+HB_EXTERN void
 hb_buffer_set_cluster_level (hb_buffer_t               *buffer,
                              hb_buffer_cluster_level_t  cluster_level);
 
-hb_buffer_cluster_level_t
+HB_EXTERN hb_buffer_cluster_level_t
 hb_buffer_get_cluster_level (hb_buffer_t *buffer);
 
+/**
+ * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
+ *
+ * The default code point for replacing invalid characters in a given encoding.
+ * Set to U+FFFD REPLACEMENT CHARACTER.
+ *
+ * Since: 0.9.31
+ */
 #define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
 
-/* Sets codepoint used to replace invalid UTF-8/16/32 entries.
- * Default is 0xFFFDu. */
-void
+HB_EXTERN void
 hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
                                      hb_codepoint_t  replacement);
 
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
 hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer);
 
 
-/* Resets the buffer.  Afterwards it's as if it was just created,
- * except that it has a larger buffer allocated perhaps... */
-void
+HB_EXTERN void
 hb_buffer_reset (hb_buffer_t *buffer);
 
-/* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */
-void
+HB_EXTERN void
 hb_buffer_clear_contents (hb_buffer_t *buffer);
 
-/* Returns false if allocation failed */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_buffer_pre_allocate (hb_buffer_t  *buffer,
                         unsigned int  size);
 
 
-/* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_buffer_allocation_successful (hb_buffer_t  *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_reverse (hb_buffer_t *buffer);
 
-void
+HB_EXTERN void
 hb_buffer_reverse_range (hb_buffer_t *buffer,
                          unsigned int start, unsigned int end);
 
-void
+HB_EXTERN void
 hb_buffer_reverse_clusters (hb_buffer_t *buffer);
 
 
 /* Filling the buffer in */
 
-void
+HB_EXTERN void
 hb_buffer_add (hb_buffer_t    *buffer,
                hb_codepoint_t  codepoint,
                unsigned int    cluster);
 
-void
+HB_EXTERN void
 hb_buffer_add_utf8 (hb_buffer_t  *buffer,
                     const char   *text,
                     int           text_length,
                     unsigned int  item_offset,
                     int           item_length);
 
-void
+HB_EXTERN void
 hb_buffer_add_utf16 (hb_buffer_t    *buffer,
                      const uint16_t *text,
                      int             text_length,
                      unsigned int    item_offset,
                      int             item_length);
 
-void
+HB_EXTERN void
 hb_buffer_add_utf32 (hb_buffer_t    *buffer,
                      const uint32_t *text,
                      int             text_length,
                      unsigned int    item_offset,
                      int             item_length);
 
-/* Allows only access to first 256 Unicode codepoints. */
-void
+HB_EXTERN void
 hb_buffer_add_latin1 (hb_buffer_t   *buffer,
                       const uint8_t *text,
                       int            text_length,
                       unsigned int   item_offset,
                       int            item_length);
 
-/* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
-void
+HB_EXTERN void
 hb_buffer_add_codepoints (hb_buffer_t          *buffer,
                           const hb_codepoint_t *text,
                           int                   text_length,
@@ -292,32 +360,25 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
                           int                   item_length);
 
 
-/* Clears any new items added at the end */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_buffer_set_length (hb_buffer_t  *buffer,
                       unsigned int  length);
 
-/* Return value valid as long as buffer not modified */
-unsigned int
+HB_EXTERN unsigned int
 hb_buffer_get_length (hb_buffer_t *buffer);
 
 /* Getting glyphs out of the buffer */
 
-/* Return value valid as long as buffer not modified */
-hb_glyph_info_t *
+HB_EXTERN hb_glyph_info_t *
 hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
                            unsigned int *length);
 
-/* Return value valid as long as buffer not modified */
-hb_glyph_position_t *
+HB_EXTERN hb_glyph_position_t *
 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
                                unsigned int *length);
 
 
-/* Reorders a glyph buffer to have canonical in-cluster glyph order / position.
- * The resulting clusters should behave identical to pre-reordering clusters.
- * NOTE: This has nothing to do with Unicode normalization. */
-void
+HB_EXTERN void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
 
 
@@ -325,7 +386,16 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
  * Serialize
  */
 
-/*
+/**
+ * hb_buffer_serialize_flags_t:
+ * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ *
+ * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
+ *
  * Since: 0.9.20
  */
 typedef enum { /*< flags >*/
@@ -336,43 +406,67 @@ typedef enum { /*< flags >*/
   HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS        = 0x00000008u
 } hb_buffer_serialize_flags_t;
 
+/**
+ * hb_buffer_serialize_format_t:
+ * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
+ *
+ * The buffer serialization and de-serialization format used in
+ * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
+ *
+ * Since: 0.9.2
+ */
 typedef enum {
   HB_BUFFER_SERIALIZE_FORMAT_TEXT       = HB_TAG('T','E','X','T'),
   HB_BUFFER_SERIALIZE_FORMAT_JSON       = HB_TAG('J','S','O','N'),
   HB_BUFFER_SERIALIZE_FORMAT_INVALID    = HB_TAG_NONE
 } hb_buffer_serialize_format_t;
 
-/* len=-1 means str is NUL-terminated. */
-hb_buffer_serialize_format_t
+HB_EXTERN hb_buffer_serialize_format_t
 hb_buffer_serialize_format_from_string (const char *str, int len);
 
-const char *
+HB_EXTERN const char *
 hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
 
-const char **
+HB_EXTERN const char **
 hb_buffer_serialize_list_formats (void);
 
-/* Returns number of items, starting at start, that were serialized. */
-unsigned int
+HB_EXTERN unsigned int
 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
                             unsigned int start,
                             unsigned int end,
                             char *buf,
                             unsigned int buf_size,
-                            unsigned int *buf_consumed, /* May be NULL */
-                            hb_font_t *font, /* May be NULL */
+                            unsigned int *buf_consumed,
+                            hb_font_t *font,
                             hb_buffer_serialize_format_t format,
                             hb_buffer_serialize_flags_t flags);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
                               const char *buf,
-                              int buf_len, /* -1 means nul-terminated */
-                              const char **end_ptr, /* May be NULL */
-                              hb_font_t *font, /* May be NULL */
+                              int buf_len,
+                              const char **end_ptr,
+                              hb_font_t *font,
                               hb_buffer_serialize_format_t format);
 
 
+/*
+ * Debugging.
+ */
+
+typedef hb_bool_t       (*hb_buffer_message_func_t)     (hb_buffer_t *buffer,
+                                                         hb_font_t   *font,
+                                                         const char  *message,
+                                                         void        *user_data);
+
+HB_EXTERN void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+                            hb_buffer_message_func_t func,
+                            void *user_data, hb_destroy_func_t destroy);
+
+
 HB_END_DECLS
 
 #endif /* HB_BUFFER_H */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
index bf5dba8da0c..d7b75ac1b1e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
@@ -88,7 +88,7 @@ hb_tag_from_string (const char *str, int len)
 /**
  * hb_tag_to_string:
  * @tag:
- * @buf: (array fixed-size=4):
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
  *
  *
  *
@@ -281,12 +281,15 @@ retry:
 
 /**
  * hb_language_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string representing
+ *       ISO 639 language code
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
  *
+ * Converts @str representing an ISO 639 language code to the corresponding
+ * #hb_language_t.
  *
  * Return value: (transfer none):
+ * The #hb_language_t corresponding to the ISO 639 language code.
  *
  * Since: 0.9.2
  **/
@@ -314,11 +317,13 @@ hb_language_from_string (const char *str, int len)
 
 /**
  * hb_language_to_string:
- * @language:
- *
+ * @language: an #hb_language_t to convert.
  *
+ * See hb_language_from_string().
  *
  * Return value: (transfer none):
+ * A %NULL-terminated string representing the @language. Must not be freed by
+ * the caller.
  *
  * Since: 0.9.2
  **/
@@ -357,11 +362,12 @@ hb_language_get_default (void)
 
 /**
  * hb_script_from_iso15924_tag:
- * @tag:
- *
+ * @tag: an #hb_tag_t representing an ISO 15924 tag.
  *
+ * Converts an ISO 15924 script tag to a corresponding #hb_script_t.
  *
  * Return value:
+ * An #hb_script_t corresponding to the ISO 15924 tag.
  *
  * Since: 0.9.2
  **/
@@ -401,28 +407,33 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
 
 /**
  * hb_script_from_string:
- * @s: (array length=len) (element-type uint8_t):
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string representing an
+ *       ISO 15924 tag.
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
  *
+ * Converts a string @str representing an ISO 15924 script tag to a
+ * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
+ * hb_script_from_iso15924_tag().
  *
  * Return value:
+ * An #hb_script_t corresponding to the ISO 15924 tag.
  *
  * Since: 0.9.2
  **/
 hb_script_t
-hb_script_from_string (const char *s, int len)
+hb_script_from_string (const char *str, int len)
 {
-  return hb_script_from_iso15924_tag (hb_tag_from_string (s, len));
+  return hb_script_from_iso15924_tag (hb_tag_from_string (str, len));
 }
 
 /**
  * hb_script_to_iso15924_tag:
- * @script:
- *
+ * @script: an #hb_script_ to convert.
  *
+ * See hb_script_from_iso15924_tag().
  *
  * Return value:
+ * An #hb_tag_t representing an ISO 15924 script tag.
  *
  * Since: 0.9.2
  **/
@@ -496,6 +507,9 @@ hb_script_get_horizontal_direction (hb_script_t script)
     /* Unicode-8.0 additions */
     case HB_SCRIPT_OLD_HUNGARIAN:
 
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_ADLAM:
+
       return HB_DIRECTION_RTL;
   }
 
@@ -521,7 +535,7 @@ hb_user_data_array_t::set (hb_user_data_key_t *key,
     }
   }
   hb_user_data_item_t item = {key, data, destroy};
-  bool ret = !!items.replace_or_insert (item, lock, replace);
+  bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
 
   return ret;
 }
@@ -529,7 +543,7 @@ hb_user_data_array_t::set (hb_user_data_key_t *key,
 void *
 hb_user_data_array_t::get (hb_user_data_key_t *key)
 {
-  hb_user_data_item_t item = {NULL };
+  hb_user_data_item_t item = {NULL, NULL, NULL};
 
   return items.find (key, &item, lock) ? item.data : NULL;
 }
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
index 1f742a2ef57..ae57c3bf2b6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
@@ -98,16 +98,22 @@ typedef uint32_t hb_tag_t;
 #define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
 
 /* len=-1 means str is NUL-terminated. */
-hb_tag_t
+HB_EXTERN hb_tag_t
 hb_tag_from_string (const char *str, int len);
 
 /* buf should have 4 bytes. */
-void
+HB_EXTERN void
 hb_tag_to_string (hb_tag_t tag, char *buf);
 
 
-/* hb_direction_t */
-
+/**
+ * hb_direction_t:
+ * @HB_DIRECTION_INVALID: Initial, unset direction.
+ * @HB_DIRECTION_LTR: Text is set horizontally from left to right.
+ * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
+ * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
+ * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ */
 typedef enum {
   HB_DIRECTION_INVALID = 0,
   HB_DIRECTION_LTR = 4,
@@ -117,10 +123,10 @@ typedef enum {
 } hb_direction_t;
 
 /* len=-1 means str is NUL-terminated */
-hb_direction_t
+HB_EXTERN hb_direction_t
 hb_direction_from_string (const char *str, int len);
 
-const char *
+HB_EXTERN const char *
 hb_direction_to_string (hb_direction_t direction);
 
 #define HB_DIRECTION_IS_VALID(dir)      ((((unsigned int) (dir)) & ~3U) == 4)
@@ -136,16 +142,15 @@ hb_direction_to_string (hb_direction_t direction);
 
 typedef const struct hb_language_impl_t *hb_language_t;
 
-/* len=-1 means str is NUL-terminated */
-hb_language_t
+HB_EXTERN hb_language_t
 hb_language_from_string (const char *str, int len);
 
-const char *
+HB_EXTERN const char *
 hb_language_to_string (hb_language_t language);
 
 #define HB_LANGUAGE_INVALID ((hb_language_t) NULL)
 
-hb_language_t
+HB_EXTERN hb_language_t
 hb_language_get_default (void);
 
 
@@ -306,6 +311,16 @@ typedef enum
   /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN               = HB_TAG ('H','u','n','g'),
   /*8.0*/ HB_SCRIPT_SIGNWRITING                 = HB_TAG ('S','g','n','w'),
 
+  /*
+   * Since 1.3.0
+   */
+  /*9.0*/ HB_SCRIPT_ADLAM                       = HB_TAG ('A','d','l','m'),
+  /*9.0*/ HB_SCRIPT_BHAIKSUKI                   = HB_TAG ('B','h','k','s'),
+  /*9.0*/ HB_SCRIPT_MARCHEN                     = HB_TAG ('M','a','r','c'),
+  /*9.0*/ HB_SCRIPT_OSAGE                       = HB_TAG ('O','s','g','e'),
+  /*9.0*/ HB_SCRIPT_TANGUT                      = HB_TAG ('T','a','n','g'),
+  /*9.0*/ HB_SCRIPT_NEWA                        = HB_TAG ('N','e','w','a'),
+
   /* No script set. */
   HB_SCRIPT_INVALID                             = HB_TAG_NONE,
 
@@ -324,18 +339,16 @@ typedef enum
 
 /* Script functions */
 
-hb_script_t
+HB_EXTERN hb_script_t
 hb_script_from_iso15924_tag (hb_tag_t tag);
 
-/* sugar for tag_from_string() then script_from_iso15924_tag */
-/* len=-1 means s is NUL-terminated */
-hb_script_t
-hb_script_from_string (const char *s, int len);
+HB_EXTERN hb_script_t
+hb_script_from_string (const char *str, int len);
 
-hb_tag_t
+HB_EXTERN hb_tag_t
 hb_script_to_iso15924_tag (hb_script_t script);
 
-hb_direction_t
+HB_EXTERN hb_direction_t
 hb_script_get_horizontal_direction (hb_script_t script);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
index 369b7365c2b..bd769a04aa8 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
@@ -27,7 +27,6 @@
  */
 
 #define HB_SHAPER coretext
-#define hb_coretext_shaper_face_data_t CGFont
 #include "hb-shaper-impl-private.hh"
 
 #include "hb-coretext.h"
@@ -78,6 +77,29 @@ HB_SHAPER_DATA_ENSURE_DECLARE(coretext, font)
  * shaper face data
  */
 
+static CTFontDescriptorRef
+get_last_resort_font_desc (void)
+{
+  // TODO Handle allocation failures?
+  CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0);
+  CFArrayRef cascade_list = CFArrayCreate (kCFAllocatorDefault,
+                                           (const void **) &last_resort,
+                                           1,
+                                           &kCFTypeArrayCallBacks);
+  CFRelease (last_resort);
+  CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault,
+                                                   (const void **) &kCTFontCascadeListAttribute,
+                                                   (const void **) &cascade_list,
+                                                   1,
+                                                   &kCFTypeDictionaryKeyCallBacks,
+                                                   &kCFTypeDictionaryValueCallBacks);
+  CFRelease (cascade_list);
+
+  CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
+  CFRelease (attributes);
+  return font_desc;
+}
+
 static void
 release_data (void *info, const void *data, size_t size)
 {
@@ -87,14 +109,13 @@ release_data (void *info, const void *data, size_t size)
   hb_blob_destroy ((hb_blob_t *) info);
 }
 
-hb_coretext_shaper_face_data_t *
-_hb_coretext_shaper_face_data_create (hb_face_t *face)
+static CGFontRef
+create_cg_font (hb_face_t *face)
 {
-  hb_coretext_shaper_face_data_t *data = NULL;
-
+  CGFontRef cg_font = NULL;
   if (face->destroy == (hb_destroy_func_t) CGFontRelease)
   {
-    data = CGFontRetain ((CGFontRef) face->user_data);
+    cg_font = CGFontRetain ((CGFontRef) face->user_data);
   }
   else
   {
@@ -107,13 +128,98 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
     CGDataProviderRef provider = CGDataProviderCreateWithData (blob, blob_data, blob_length, &release_data);
     if (likely (provider))
     {
-      data = CGFontCreateWithDataProvider (provider);
+      cg_font = CGFontCreateWithDataProvider (provider);
+      if (unlikely (!cg_font))
+        DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
       CGDataProviderRelease (provider);
     }
   }
+  return cg_font;
+}
 
-  if (unlikely (!data)) {
-    DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
+static CTFontRef
+create_ct_font (CGFontRef cg_font, CGFloat font_size)
+{
+  CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL);
+  if (unlikely (!ct_font)) {
+    DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
+    return NULL;
+  }
+  CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
+
+  /* Create font copy with cascade list that has LastResort first; this speeds up CoreText
+   * font fallback which we don't need anyway. */
+  {
+    CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
+    CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc);
+    CFRelease (last_resort_font_desc);
+    if (new_ct_font)
+    {
+      /* The CTFontCreateCopyWithAttributes call fails to stay on the same font
+       * when reconfiguring the cascade list and may switch to a different font
+       * when there are fonts that go by the same name, since the descriptor is
+       * just name and size.
+       *
+       * Avoid reconfiguring the cascade lists if the new font is outside the
+       * system locations that we cannot access from the sandboxed renderer
+       * process in Blink. This can be detected by the new file URL location
+       * that the newly found font points to. */
+      CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+      // Keep reconfigured font if URL cannot be retrieved (seems to be the case
+      // on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606
+      if (!original_url || !new_url || CFEqual (original_url, new_url)) {
+        CFRelease (ct_font);
+        ct_font = new_ct_font;
+      } else {
+        CFRelease (new_ct_font);
+        DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
+      }
+      if (new_url)
+        CFRelease (new_url);
+    }
+    else
+      DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
+  }
+
+  if (original_url)
+    CFRelease (original_url);
+  return ct_font;
+}
+
+struct hb_coretext_shaper_face_data_t {
+  CGFontRef cg_font;
+  CTFontRef ct_font;
+};
+
+hb_coretext_shaper_face_data_t *
+_hb_coretext_shaper_face_data_create (hb_face_t *face)
+{
+  hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t));
+  if (unlikely (!data))
+    return NULL;
+
+  data->cg_font = create_cg_font (face);
+  if (unlikely (!data->cg_font))
+  {
+    DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
+    free (data);
+    return NULL;
+  }
+
+  /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table,
+   * which can make the font too tight at large sizes.  36pt should be a good semi-neutral
+   * size.
+   *
+   * Since we always create CTFont at a fixed size, our CTFont lives in face_data
+   * instead of font_data.  Which is good, because when people change scale on
+   * hb_font_t, we won't need to update our CTFont. */
+  data->ct_font = create_ct_font (data->cg_font, 36.);
+  if (unlikely (!data->ct_font))
+  {
+    DEBUG_MSG (CORETEXT, face, "CTFont creation failed.");
+    CFRelease (data->cg_font);
+    free (data);
+    return NULL;
   }
 
   return data;
@@ -122,7 +228,9 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
 void
 _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
 {
-  CFRelease (data);
+  CFRelease (data->ct_font);
+  CFRelease (data->cg_font);
+  free (data);
 }
 
 /*
@@ -133,7 +241,7 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
 {
   if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
   hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-  return face_data;
+  return face_data->cg_font;
 }
 
 
@@ -141,49 +249,17 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
  * shaper font data
  */
 
-struct hb_coretext_shaper_font_data_t {
-  CTFontRef ct_font;
-  CGFloat x_mult, y_mult; /* From CT space to HB space. */
-};
+struct hb_coretext_shaper_font_data_t {};
 
 hb_coretext_shaper_font_data_t *
-_hb_coretext_shaper_font_data_create (hb_font_t *font)
+_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED)
 {
-  if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL;
-
-  hb_coretext_shaper_font_data_t *data = (hb_coretext_shaper_font_data_t *) calloc (1, sizeof (hb_coretext_shaper_font_data_t));
-  if (unlikely (!data))
-    return NULL;
-
-  hb_face_t *face = font->face;
-  hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-
-  /* Choose a CoreText font size and calculate multipliers to convert to HarfBuzz space. */
-  /* TODO: use upem instead of 36? */
-  CGFloat font_size = 36.; /* Default... */
-  /* No idea if the following is even a good idea. */
-  if (font->y_ppem)
-    font_size = font->y_ppem;
-
-  if (font_size < 0)
-    font_size = -font_size;
-  data->x_mult = (CGFloat) font->x_scale / font_size;
-  data->y_mult = (CGFloat) font->y_scale / font_size;
-  data->ct_font = CTFontCreateWithGraphicsFont (face_data, font_size, NULL, NULL);
-  if (unlikely (!data->ct_font)) {
-    DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed");
-    free (data);
-    return NULL;
-  }
-
-  return data;
+  return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
 
 void
 _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
 {
-  CFRelease (data->ct_font);
-  free (data);
 }
 
 
@@ -209,9 +285,10 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_
 CTFontRef
 hb_coretext_font_get_ct_font (hb_font_t *font)
 {
-  if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL;
-  hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
-  return font_data->ct_font;
+  hb_face_t *face = font->face;
+  if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
+  hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+  return face_data->ct_font;
 }
 
 
@@ -444,7 +521,10 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
 {
   hb_face_t *face = font->face;
   hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-  hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
+
+  CGFloat ct_font_size = CTFontGetSize (face_data->ct_font);
+  CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+  CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
 
   /* Attach marks to their bases, to match the 'ot' shaper.
    * Adapted from hb-ot-shape:hb_form_clusters().
@@ -453,6 +533,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
    * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will
    * continue pointing to B2 even though B2 was merged into B1's
    * cluster... */
+  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
   {
     hb_unicode_funcs_t *unicode = buffer->unicode;
     unsigned int count = buffer->len;
@@ -575,7 +656,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
           CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
           CFRelease (attributes);
 
-          range->font = CTFontCreateCopyWithAttributes (font_data->ct_font, 0.0, NULL, font_desc);
+          range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc);
           CFRelease (font_desc);
         }
         else
@@ -693,7 +774,6 @@ resize_and_retry:
     scratch += old_scratch_used;
     scratch_size -= old_scratch_used;
   }
-retry:
   {
     string_ref = CFStringCreateWithCharactersNoCopy (NULL,
                                                      pchars, chars_len,
@@ -733,7 +813,7 @@ retry:
         CFRelease (lang);
       }
       CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
-                                      kCTFontAttributeName, font_data->ct_font);
+                                      kCTFontAttributeName, face_data->ct_font);
 
       if (num_features)
       {
@@ -826,7 +906,7 @@ retry:
        */
       CFDictionaryRef attributes = CTRunGetAttributes (run);
       CTFontRef run_ct_font = static_cast(CFDictionaryGetValue (attributes, kCTFontAttributeName));
-      if (!CFEqual (run_ct_font, font_data->ct_font))
+      if (!CFEqual (run_ct_font, face_data->ct_font))
       {
         /* The run doesn't use our main font instance.  We have to figure out
          * whether font fallback happened, or this is just CoreText giving us
@@ -846,15 +926,11 @@ retry:
          * backend.
          *
          * However, even that wouldn't work if we were passed in the CGFont to
-         * begin with.
-         *
-         * Webkit uses a slightly different approach: it installs LastResort
-         * as fallback chain, and then checks PS name of used font against
-         * LastResort.  That one is safe for any font except for LastResort,
-         * as opposed to ours, which can fail if we are using any uninstalled
-         * font that has the same name as an installed font.
+         * construct a hb_face to begin with.
          *
          * See: http://github.com/behdad/harfbuzz/pull/36
+         *
+         * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
          */
         bool matched = false;
         for (unsigned int i = 0; i < range_records.len; i++)
@@ -868,13 +944,13 @@ retry:
           CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
           if (run_cg_font)
           {
-            matched = CFEqual (run_cg_font, face_data);
+            matched = CFEqual (run_cg_font, face_data->cg_font);
             CFRelease (run_cg_font);
           }
         }
         if (!matched)
         {
-          CFStringRef font_ps_name = CTFontCopyName (font_data->ct_font, kCTFontPostScriptNameKey);
+          CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey);
           CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
           CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
           CFRelease (run_ps_name);
@@ -994,7 +1070,6 @@ retry:
           positions = position_buf;
         }
         hb_glyph_info_t *info = run_info;
-        CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult;
         if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
         {
           hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
@@ -1129,10 +1204,6 @@ fail:
  * AAT shaper
  */
 
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, face)
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, font)
-
-
 /*
  * shaper face data
  */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
index 25267bc9784..82066e4e0dc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
@@ -44,14 +44,14 @@ HB_BEGIN_DECLS
 #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
 
 
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_coretext_face_create (CGFontRef cg_font);
 
 
-CGFontRef
+HB_EXTERN CGFontRef
 hb_coretext_face_get_cg_font (hb_face_t *face);
 
-CTFontRef
+HB_EXTERN CTFontRef
 hb_coretext_font_get_ct_font (hb_font_t *font);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
index 14d435f0068..3943a00a7f3 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
@@ -44,6 +44,16 @@ HB_BEGIN_DECLS
 #define HB_BUFFER_FLAGS_DEFAULT                 HB_BUFFER_FLAG_DEFAULT
 #define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT       HB_BUFFER_SERIALIZE_FLAG_DEFAULT
 
+typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
+                                               hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                                               hb_codepoint_t *glyph,
+                                               void *user_data);
+
+HB_EXTERN void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+                              hb_font_get_glyph_func_t func,
+                              void *user_data, hb_destroy_func_t destroy);
+
 #endif
 
 HB_END_DECLS
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
index 85807dda302..08ffca30d52 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
@@ -43,28 +43,28 @@ HB_BEGIN_DECLS
 
 typedef struct hb_face_t hb_face_t;
 
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_face_create (hb_blob_t    *blob,
                 unsigned int  index);
 
 typedef hb_blob_t * (*hb_reference_table_func_t)  (hb_face_t *face, hb_tag_t tag, void *user_data);
 
 /* calls destroy() when not needing user_data anymore */
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_face_create_for_tables (hb_reference_table_func_t  reference_table_func,
                            void                      *user_data,
                            hb_destroy_func_t          destroy);
 
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_face_get_empty (void);
 
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_face_reference (hb_face_t *face);
 
-void
+HB_EXTERN void
 hb_face_destroy (hb_face_t *face);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_face_set_user_data (hb_face_t          *face,
                        hb_user_data_key_t *key,
                        void *              data,
@@ -72,43 +72,43 @@ hb_face_set_user_data (hb_face_t          *face,
                        hb_bool_t           replace);
 
 
-void *
+HB_EXTERN void *
 hb_face_get_user_data (hb_face_t          *face,
                        hb_user_data_key_t *key);
 
-void
+HB_EXTERN void
 hb_face_make_immutable (hb_face_t *face);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_face_is_immutable (hb_face_t *face);
 
 
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_face_reference_table (hb_face_t *face,
                          hb_tag_t   tag);
 
-hb_blob_t *
+HB_EXTERN hb_blob_t *
 hb_face_reference_blob (hb_face_t *face);
 
-void
+HB_EXTERN void
 hb_face_set_index (hb_face_t    *face,
                    unsigned int  index);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_face_get_index (hb_face_t    *face);
 
-void
+HB_EXTERN void
 hb_face_set_upem (hb_face_t    *face,
                   unsigned int  upem);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_face_get_upem (hb_face_t *face);
 
-void
+HB_EXTERN void
 hb_face_set_glyph_count (hb_face_t    *face,
                          unsigned int  glyph_count);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_face_get_glyph_count (hb_face_t *face);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
index 8e1628be033..dee7d7d12eb 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
@@ -106,7 +106,7 @@ _hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
    */
 
   hb_codepoint_t space;
-  bool has_space = font->get_glyph (' ', 0, &space);
+  bool has_space = (bool) font->get_nominal_glyph (' ', &space);
 
   buffer->clear_positions ();
 
@@ -123,7 +123,7 @@ _hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
       pos[i].y_advance = 0;
       continue;
     }
-    font->get_glyph (info[i].codepoint, 0, &info[i].codepoint);
+    font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
     font->get_glyph_advance_for_direction (info[i].codepoint,
                                            direction,
                                            &pos[i].x_advance,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
index 253e71786f6..d7b48776e1e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
@@ -42,7 +42,10 @@
  */
 
 #define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
-  HB_FONT_FUNC_IMPLEMENT (glyph) \
+  HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
+  HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
+  HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
+  HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
   HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
   HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
   HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
@@ -61,14 +64,6 @@ struct hb_font_funcs_t {
 
   hb_bool_t immutable;
 
-  /* Don't access these directly.  Call hb_font_get_*() instead. */
-
-  struct {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
-    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
-  } get;
-
   struct {
 #define HB_FONT_FUNC_IMPLEMENT(name) void *name;
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
@@ -80,6 +75,16 @@ struct hb_font_funcs_t {
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   } destroy;
+
+  /* Don't access these directly.  Call font->get_*() instead. */
+  union get_t {
+    struct get_funcs_t {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    } f;
+    void (*array[VAR]) (void);
+  } get;
 };
 
 
@@ -144,95 +149,133 @@ struct hb_font_t {
 
   /* Public getters */
 
-  inline hb_bool_t has_glyph (hb_codepoint_t unicode)
+  HB_INTERNAL bool has_func (unsigned int i);
+
+  /* has_* ... */
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+  bool \
+  has_##name##_func (void) \
+  { \
+    hb_font_funcs_t *funcs = this->klass; \
+    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+    return has_func (i); \
+  }
+  HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+  inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
   {
-    hb_codepoint_t glyph;
-    return get_glyph (unicode, 0, &glyph);
+    memset (extents, 0, sizeof (*extents));
+    return klass->get.f.font_h_extents (this, user_data,
+                                        extents,
+                                        klass->user_data.font_h_extents);
+  }
+  inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
+  {
+    memset (extents, 0, sizeof (*extents));
+    return klass->get.f.font_v_extents (this, user_data,
+                                        extents,
+                                        klass->user_data.font_v_extents);
   }
 
-  inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
-                              hb_codepoint_t *glyph)
+  inline bool has_glyph (hb_codepoint_t unicode)
+  {
+    hb_codepoint_t glyph;
+    return get_nominal_glyph (unicode, &glyph);
+  }
+
+  inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
+                                      hb_codepoint_t *glyph)
   {
     *glyph = 0;
-    return klass->get.glyph (this, user_data,
-                             unicode, variation_selector, glyph,
-                             klass->user_data.glyph);
+    return klass->get.f.nominal_glyph (this, user_data,
+                                       unicode, glyph,
+                                       klass->user_data.nominal_glyph);
+  }
+
+  inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                                        hb_codepoint_t *glyph)
+  {
+    *glyph = 0;
+    return klass->get.f.variation_glyph (this, user_data,
+                                         unicode, variation_selector, glyph,
+                                         klass->user_data.variation_glyph);
   }
 
   inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
   {
-    return klass->get.glyph_h_advance (this, user_data,
-                                       glyph,
-                                       klass->user_data.glyph_h_advance);
+    return klass->get.f.glyph_h_advance (this, user_data,
+                                         glyph,
+                                         klass->user_data.glyph_h_advance);
   }
 
   inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
   {
-    return klass->get.glyph_v_advance (this, user_data,
-                                       glyph,
-                                       klass->user_data.glyph_v_advance);
+    return klass->get.f.glyph_v_advance (this, user_data,
+                                         glyph,
+                                         klass->user_data.glyph_v_advance);
   }
 
   inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
                                        hb_position_t *x, hb_position_t *y)
   {
     *x = *y = 0;
-    return klass->get.glyph_h_origin (this, user_data,
-                                      glyph, x, y,
-                                      klass->user_data.glyph_h_origin);
+    return klass->get.f.glyph_h_origin (this, user_data,
+                                        glyph, x, y,
+                                        klass->user_data.glyph_h_origin);
   }
 
   inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
                                        hb_position_t *x, hb_position_t *y)
   {
     *x = *y = 0;
-    return klass->get.glyph_v_origin (this, user_data,
-                                      glyph, x, y,
-                                      klass->user_data.glyph_v_origin);
+    return klass->get.f.glyph_v_origin (this, user_data,
+                                        glyph, x, y,
+                                        klass->user_data.glyph_v_origin);
   }
 
   inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
   {
-    return klass->get.glyph_h_kerning (this, user_data,
-                                       left_glyph, right_glyph,
-                                       klass->user_data.glyph_h_kerning);
+    return klass->get.f.glyph_h_kerning (this, user_data,
+                                         left_glyph, right_glyph,
+                                         klass->user_data.glyph_h_kerning);
   }
 
   inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
   {
-    return klass->get.glyph_v_kerning (this, user_data,
-                                       top_glyph, bottom_glyph,
-                                       klass->user_data.glyph_v_kerning);
+    return klass->get.f.glyph_v_kerning (this, user_data,
+                                         top_glyph, bottom_glyph,
+                                         klass->user_data.glyph_v_kerning);
   }
 
   inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
                                       hb_glyph_extents_t *extents)
   {
     memset (extents, 0, sizeof (*extents));
-    return klass->get.glyph_extents (this, user_data,
-                                     glyph,
-                                     extents,
-                                     klass->user_data.glyph_extents);
+    return klass->get.f.glyph_extents (this, user_data,
+                                       glyph,
+                                       extents,
+                                       klass->user_data.glyph_extents);
   }
 
   inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
                                             hb_position_t *x, hb_position_t *y)
   {
     *x = *y = 0;
-    return klass->get.glyph_contour_point (this, user_data,
-                                           glyph, point_index,
-                                           x, y,
-                                           klass->user_data.glyph_contour_point);
+    return klass->get.f.glyph_contour_point (this, user_data,
+                                             glyph, point_index,
+                                             x, y,
+                                             klass->user_data.glyph_contour_point);
   }
 
   inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
                                    char *name, unsigned int size)
   {
     if (size) *name = '\0';
-    return klass->get.glyph_name (this, user_data,
-                                  glyph,
-                                  name, size,
-                                  klass->user_data.glyph_name);
+    return klass->get.f.glyph_name (this, user_data,
+                                    glyph,
+                                    name, size,
+                                    klass->user_data.glyph_name);
   }
 
   inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
@@ -240,15 +283,35 @@ struct hb_font_t {
   {
     *glyph = 0;
     if (len == -1) len = strlen (name);
-    return klass->get.glyph_from_name (this, user_data,
-                                       name, len,
-                                       glyph,
-                                       klass->user_data.glyph_from_name);
+    return klass->get.f.glyph_from_name (this, user_data,
+                                         name, len,
+                                         glyph,
+                                         klass->user_data.glyph_from_name);
   }
 
 
   /* A bit higher-level, and with fallback */
 
+  inline void get_extents_for_direction (hb_direction_t direction,
+                                         hb_font_extents_t *extents)
+  {
+    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
+      if (!get_font_h_extents (extents))
+      {
+        extents->ascender = y_scale * .8;
+        extents->descender = y_scale - extents->ascender;
+        extents->line_gap = 0;
+      }
+    } else {
+      if (!get_font_v_extents (extents))
+      {
+        extents->ascender = x_scale / 2;
+        extents->descender = x_scale - extents->ascender;
+        extents->line_gap = 0;
+      }
+    }
+  }
+
   inline void get_glyph_advance_for_direction (hb_codepoint_t glyph,
                                                hb_direction_t direction,
                                                hb_position_t *x, hb_position_t *y)
@@ -268,7 +331,7 @@ struct hb_font_t {
   {
     *x = get_glyph_h_advance (glyph) / 2;
 
-    /* TODO use font_metrics.ascent */
+    /* TODO use font_extents.ascender */
     *y = y_scale;
   }
 
@@ -298,6 +361,26 @@ struct hb_font_t {
     }
   }
 
+  inline void add_glyph_h_origin (hb_codepoint_t glyph,
+                                  hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+    *x += origin_x;
+    *y += origin_y;
+  }
+  inline void add_glyph_v_origin (hb_codepoint_t glyph,
+                                  hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+    *x += origin_x;
+    *y += origin_y;
+  }
   inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
                                               hb_direction_t direction,
                                               hb_position_t *x, hb_position_t *y)
@@ -310,6 +393,26 @@ struct hb_font_t {
     *y += origin_y;
   }
 
+  inline void subtract_glyph_h_origin (hb_codepoint_t glyph,
+                                       hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+    *x -= origin_x;
+    *y -= origin_y;
+  }
+  inline void subtract_glyph_v_origin (hb_codepoint_t glyph,
+                                       hb_position_t *x, hb_position_t *y)
+  {
+    hb_position_t origin_x, origin_y;
+
+    get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+    *x -= origin_x;
+    *y -= origin_y;
+  }
   inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
                                                    hb_direction_t direction,
                                                    hb_position_t *x, hb_position_t *y)
@@ -394,7 +497,7 @@ struct hb_font_t {
       hb_codepoint_t unichar;
       if (0 == strncmp (s, "uni", 3) &&
           hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
-          get_glyph (unichar, 0, glyph))
+          get_nominal_glyph (unichar, glyph))
         return true;
     }
 
@@ -402,7 +505,13 @@ struct hb_font_t {
   }
 
   private:
-  inline hb_position_t em_scale (int16_t v, int scale) { return (hb_position_t) (v * (int64_t) scale / face->get_upem ()); }
+  inline hb_position_t em_scale (int16_t v, int scale)
+  {
+    int upem = face->get_upem ();
+    int64_t scaled = v * (int64_t) scale;
+    scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
+    return (hb_position_t) (scaled / upem);
+  }
 };
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
index fdf871f15ff..eb0f9fcfd09 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
@@ -45,130 +45,246 @@
  */
 
 static hb_bool_t
-hb_font_get_glyph_nil (hb_font_t *font,
-                       void *font_data HB_UNUSED,
-                       hb_codepoint_t unicode,
-                       hb_codepoint_t variation_selector,
-                       hb_codepoint_t *glyph,
-                       void *user_data HB_UNUSED)
+hb_font_get_font_h_extents_nil (hb_font_t *font,
+                                void *font_data HB_UNUSED,
+                                hb_font_extents_t *metrics,
+                                void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent->get_glyph (unicode, variation_selector, glyph);
+  memset (metrics, 0, sizeof (*metrics));
+  return false;
+}
+static hb_bool_t
+hb_font_get_font_h_extents_parent (hb_font_t *font,
+                                   void *font_data HB_UNUSED,
+                                   hb_font_extents_t *metrics,
+                                   void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_font_h_extents (metrics);
+  if (ret) {
+    metrics->ascender = font->parent_scale_y_distance (metrics->ascender);
+    metrics->descender = font->parent_scale_y_distance (metrics->descender);
+    metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap);
+  }
+  return ret;
+}
 
+static hb_bool_t
+hb_font_get_font_v_extents_nil (hb_font_t *font,
+                                void *font_data HB_UNUSED,
+                                hb_font_extents_t *metrics,
+                                void *user_data HB_UNUSED)
+{
+  memset (metrics, 0, sizeof (*metrics));
+  return false;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_parent (hb_font_t *font,
+                                   void *font_data HB_UNUSED,
+                                   hb_font_extents_t *metrics,
+                                   void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_font_v_extents (metrics);
+  if (ret) {
+    metrics->ascender = font->parent_scale_x_distance (metrics->ascender);
+    metrics->descender = font->parent_scale_x_distance (metrics->descender);
+    metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap);
+  }
+  return ret;
+}
+
+static hb_bool_t
+hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
+                               void *font_data HB_UNUSED,
+                               hb_codepoint_t unicode,
+                               hb_codepoint_t *glyph,
+                               void *user_data HB_UNUSED)
+{
   *glyph = 0;
   return false;
 }
+static hb_bool_t
+hb_font_get_nominal_glyph_parent (hb_font_t *font,
+                                  void *font_data HB_UNUSED,
+                                  hb_codepoint_t unicode,
+                                  hb_codepoint_t *glyph,
+                                  void *user_data HB_UNUSED)
+{
+  return font->parent->get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
+                                 void *font_data HB_UNUSED,
+                                 hb_codepoint_t unicode,
+                                 hb_codepoint_t variation_selector,
+                                 hb_codepoint_t *glyph,
+                                 void *user_data HB_UNUSED)
+{
+  *glyph = 0;
+  return false;
+}
+static hb_bool_t
+hb_font_get_variation_glyph_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    hb_codepoint_t unicode,
+                                    hb_codepoint_t variation_selector,
+                                    hb_codepoint_t *glyph,
+                                    void *user_data HB_UNUSED)
+{
+  return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
 
 static hb_position_t
-hb_font_get_glyph_h_advance_nil (hb_font_t *font,
+hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
                                  void *font_data HB_UNUSED,
                                  hb_codepoint_t glyph,
                                  void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
-
   return font->x_scale;
 }
+static hb_position_t
+hb_font_get_glyph_h_advance_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    hb_codepoint_t glyph,
+                                    void *user_data HB_UNUSED)
+{
+  return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
+}
 
 static hb_position_t
-hb_font_get_glyph_v_advance_nil (hb_font_t *font,
+hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
                                  void *font_data HB_UNUSED,
                                  hb_codepoint_t glyph,
                                  void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
-
+  /* TODO use font_extents.ascender+descender */
   return font->y_scale;
 }
-
-static hb_bool_t
-hb_font_get_glyph_h_origin_nil (hb_font_t *font,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t glyph,
-                                hb_position_t *x,
-                                hb_position_t *y,
-                                void *user_data HB_UNUSED)
+static hb_position_t
+hb_font_get_glyph_v_advance_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    hb_codepoint_t glyph,
+                                    void *user_data HB_UNUSED)
 {
-  if (font->parent) {
-    hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
-    if (ret)
-      font->parent_scale_position (x, y);
-    return ret;
-  }
-
-  *x = *y = 0;
-  return false;
+  return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
 }
 
 static hb_bool_t
-hb_font_get_glyph_v_origin_nil (hb_font_t *font,
+hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
                                 void *font_data HB_UNUSED,
                                 hb_codepoint_t glyph,
                                 hb_position_t *x,
                                 hb_position_t *y,
                                 void *user_data HB_UNUSED)
 {
-  if (font->parent) {
-    hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
-    if (ret)
-      font->parent_scale_position (x, y);
-    return ret;
-  }
+  *x = *y = 0;
+  return true;
+}
+static hb_bool_t
+hb_font_get_glyph_h_origin_parent (hb_font_t *font,
+                                   void *font_data HB_UNUSED,
+                                   hb_codepoint_t glyph,
+                                   hb_position_t *x,
+                                   hb_position_t *y,
+                                   void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
 
+static hb_bool_t
+hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
+                                void *font_data HB_UNUSED,
+                                hb_codepoint_t glyph,
+                                hb_position_t *x,
+                                hb_position_t *y,
+                                void *user_data HB_UNUSED)
+{
   *x = *y = 0;
   return false;
 }
+static hb_bool_t
+hb_font_get_glyph_v_origin_parent (hb_font_t *font,
+                                   void *font_data HB_UNUSED,
+                                   hb_codepoint_t glyph,
+                                   hb_position_t *x,
+                                   hb_position_t *y,
+                                   void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
 
 static hb_position_t
-hb_font_get_glyph_h_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
                                  void *font_data HB_UNUSED,
                                  hb_codepoint_t left_glyph,
                                  hb_codepoint_t right_glyph,
                                  void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
-
   return 0;
 }
+static hb_position_t
+hb_font_get_glyph_h_kerning_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    hb_codepoint_t left_glyph,
+                                    hb_codepoint_t right_glyph,
+                                    void *user_data HB_UNUSED)
+{
+  return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
+}
 
 static hb_position_t
-hb_font_get_glyph_v_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
                                  void *font_data HB_UNUSED,
                                  hb_codepoint_t top_glyph,
                                  hb_codepoint_t bottom_glyph,
                                  void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
-
   return 0;
 }
+static hb_position_t
+hb_font_get_glyph_v_kerning_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    hb_codepoint_t top_glyph,
+                                    hb_codepoint_t bottom_glyph,
+                                    void *user_data HB_UNUSED)
+{
+  return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
+}
 
 static hb_bool_t
-hb_font_get_glyph_extents_nil (hb_font_t *font,
+hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
                                void *font_data HB_UNUSED,
                                hb_codepoint_t glyph,
                                hb_glyph_extents_t *extents,
                                void *user_data HB_UNUSED)
 {
-  if (font->parent) {
-    hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
-    if (ret) {
-      font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
-      font->parent_scale_distance (&extents->width, &extents->height);
-    }
-    return ret;
-  }
-
   memset (extents, 0, sizeof (*extents));
   return false;
 }
+static hb_bool_t
+hb_font_get_glyph_extents_parent (hb_font_t *font,
+                                  void *font_data HB_UNUSED,
+                                  hb_codepoint_t glyph,
+                                  hb_glyph_extents_t *extents,
+                                  void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
+  if (ret) {
+    font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
+    font->parent_scale_distance (&extents->width, &extents->height);
+  }
+  return ret;
+}
 
 static hb_bool_t
-hb_font_get_glyph_contour_point_nil (hb_font_t *font,
+hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
                                      void *font_data HB_UNUSED,
                                      hb_codepoint_t glyph,
                                      unsigned int point_index,
@@ -176,45 +292,63 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font,
                                      hb_position_t *y,
                                      void *user_data HB_UNUSED)
 {
-  if (font->parent) {
-    hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
-    if (ret)
-      font->parent_scale_position (x, y);
-    return ret;
-  }
-
   *x = *y = 0;
   return false;
 }
+static hb_bool_t
+hb_font_get_glyph_contour_point_parent (hb_font_t *font,
+                                        void *font_data HB_UNUSED,
+                                        hb_codepoint_t glyph,
+                                        unsigned int point_index,
+                                        hb_position_t *x,
+                                        hb_position_t *y,
+                                        void *user_data HB_UNUSED)
+{
+  hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
+  if (ret)
+    font->parent_scale_position (x, y);
+  return ret;
+}
 
 static hb_bool_t
-hb_font_get_glyph_name_nil (hb_font_t *font,
+hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
                             void *font_data HB_UNUSED,
                             hb_codepoint_t glyph,
                             char *name, unsigned int size,
                             void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent->get_glyph_name (glyph, name, size);
-
   if (size) *name = '\0';
   return false;
 }
+static hb_bool_t
+hb_font_get_glyph_name_parent (hb_font_t *font,
+                               void *font_data HB_UNUSED,
+                               hb_codepoint_t glyph,
+                               char *name, unsigned int size,
+                               void *user_data HB_UNUSED)
+{
+  return font->parent->get_glyph_name (glyph, name, size);
+}
 
 static hb_bool_t
-hb_font_get_glyph_from_name_nil (hb_font_t *font,
+hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
                                  void *font_data HB_UNUSED,
                                  const char *name, int len, /* -1 means nul-terminated */
                                  hb_codepoint_t *glyph,
                                  void *user_data HB_UNUSED)
 {
-  if (font->parent)
-    return font->parent->get_glyph_from_name (name, len, glyph);
-
   *glyph = 0;
   return false;
 }
-
+static hb_bool_t
+hb_font_get_glyph_from_name_parent (hb_font_t *font,
+                                    void *font_data HB_UNUSED,
+                                    const char *name, int len, /* -1 means nul-terminated */
+                                    hb_codepoint_t *glyph,
+                                    void *user_data HB_UNUSED)
+{
+  return font->parent->get_glyph_from_name (name, len, glyph);
+}
 
 static const hb_font_funcs_t _hb_font_funcs_nil = {
   HB_OBJECT_HEADER_STATIC,
@@ -222,9 +356,44 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
   true, /* immutable */
 
   {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+    {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    }
+  }
+};
+static const hb_font_funcs_t _hb_font_funcs_parent = {
+  HB_OBJECT_HEADER_STATIC,
+
+  true, /* immutable */
+
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+  },
+  {
+    {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent,
+      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+    }
   }
 };
 
@@ -246,7 +415,7 @@ hb_font_funcs_create (void)
   if (!(ffuncs = hb_object_create ()))
     return hb_font_funcs_get_empty ();
 
-  ffuncs->get = _hb_font_funcs_nil.get;
+  ffuncs->get = _hb_font_funcs_parent.get;
 
   return ffuncs;
 }
@@ -263,7 +432,7 @@ hb_font_funcs_create (void)
 hb_font_funcs_t *
 hb_font_funcs_get_empty (void)
 {
-  return const_cast (&_hb_font_funcs_nil);
+  return const_cast (&_hb_font_funcs_parent);
 }
 
 /**
@@ -398,11 +567,11 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
     ffuncs->destroy.name (ffuncs->user_data.name);                       \
                                                                          \
   if (func) {                                                            \
-    ffuncs->get.name = func;                                             \
+    ffuncs->get.f.name = func;                                           \
     ffuncs->user_data.name = user_data;                                  \
     ffuncs->destroy.name = destroy;                                      \
   } else {                                                               \
-    ffuncs->get.name = hb_font_get_##name##_nil;                         \
+    ffuncs->get.f.name = hb_font_get_##name##_parent;                    \
     ffuncs->user_data.name = NULL;                                       \
     ffuncs->destroy.name = NULL;                                         \
   }                                                                      \
@@ -411,9 +580,52 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
 HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
 
+bool
+hb_font_t::has_func (unsigned int i)
+{
+  if (parent && parent != hb_font_get_empty () && parent->has_func (i))
+    return true;
+  return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i];
+}
 
 /* Public getters */
 
+/**
+ * hb_font_get_h_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+                       hb_font_extents_t *extents)
+{
+  return font->get_font_h_extents (extents);
+}
+
+/**
+ * hb_font_get_v_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+                       hb_font_extents_t *extents)
+{
+  return font->get_font_v_extents (extents);
+}
+
 /**
  * hb_font_get_glyph:
  * @font: a font.
@@ -432,7 +644,50 @@ hb_font_get_glyph (hb_font_t *font,
                    hb_codepoint_t unicode, hb_codepoint_t variation_selector,
                    hb_codepoint_t *glyph)
 {
-  return font->get_glyph (unicode, variation_selector, glyph);
+  if (unlikely (variation_selector))
+    return font->get_variation_glyph (unicode, variation_selector, glyph);
+  return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_nominal_glyph:
+ * @font: a font.
+ * @unicode:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+                           hb_codepoint_t unicode,
+                           hb_codepoint_t *glyph)
+{
+  return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_variation_glyph:
+ * @font: a font.
+ * @unicode:
+ * @variation_selector:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+                             hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                             hb_codepoint_t *glyph)
+{
+  return font->get_variation_glyph (unicode, variation_selector, glyph);
 }
 
 /**
@@ -638,6 +893,23 @@ hb_font_get_glyph_from_name (hb_font_t *font,
 
 /* A bit higher-level, and with fallback */
 
+/**
+ * hb_font_get_extents_for_direction:
+ * @font: a font.
+ * @direction:
+ * @extents:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_font_get_extents_for_direction (hb_font_t *font,
+                                   hb_direction_t direction,
+                                   hb_font_extents_t *extents)
+{
+  return font->get_extents_for_direction (direction, extents);
+}
 /**
  * hb_font_get_glyph_advance_for_direction:
  * @font: a font.
@@ -858,6 +1130,7 @@ hb_font_create (hb_face_t *face)
     return hb_font_get_empty ();
 
   hb_face_make_immutable (face);
+  font->parent = hb_font_get_empty ();
   font->face = hb_face_reference (face);
   font->klass = hb_font_funcs_get_empty ();
 
@@ -917,8 +1190,8 @@ hb_font_get_empty (void)
     NULL, /* parent */
     const_cast (&_hb_face_nil),
 
-    0, /* x_scale */
-    0, /* y_scale */
+    1000, /* x_scale */
+    1000, /* y_scale */
 
     0, /* x_ppem */
     0, /* y_ppem */
@@ -1264,3 +1537,131 @@ hb_font_get_ppem (hb_font_t *font,
   if (x_ppem) *x_ppem = font->x_ppem;
   if (y_ppem) *y_ppem = font->y_ppem;
 }
+
+
+#ifndef HB_DISABLE_DEPRECATED
+
+/*
+ * Deprecated get_glyph_func():
+ */
+
+struct hb_trampoline_closure_t
+{
+  void *user_data;
+  hb_destroy_func_t destroy;
+  unsigned int ref_count;
+};
+
+template 
+struct hb_trampoline_t
+{
+  hb_trampoline_closure_t closure; /* Must be first. */
+  FuncType func;
+};
+
+template 
+static hb_trampoline_t *
+trampoline_create (FuncType           func,
+                   void              *user_data,
+                   hb_destroy_func_t  destroy)
+{
+  typedef hb_trampoline_t trampoline_t;
+
+  trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
+
+  if (unlikely (!trampoline))
+    return NULL;
+
+  trampoline->closure.user_data = user_data;
+  trampoline->closure.destroy = destroy;
+  trampoline->closure.ref_count = 1;
+  trampoline->func = func;
+
+  return trampoline;
+}
+
+static void
+trampoline_reference (hb_trampoline_closure_t *closure)
+{
+  closure->ref_count++;
+}
+
+static void
+trampoline_destroy (void *user_data)
+{
+  hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
+
+  if (--closure->ref_count)
+    return;
+
+  if (closure->destroy)
+    closure->destroy (closure->user_data);
+  free (closure);
+}
+
+typedef hb_trampoline_t hb_font_get_glyph_trampoline_t;
+
+static hb_bool_t
+hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
+                                      void *font_data,
+                                      hb_codepoint_t unicode,
+                                      hb_codepoint_t *glyph,
+                                      void *user_data)
+{
+  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+  return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_trampoline (hb_font_t *font,
+                                        void *font_data,
+                                        hb_codepoint_t unicode,
+                                        hb_codepoint_t variation_selector,
+                                        hb_codepoint_t *glyph,
+                                        void *user_data)
+{
+  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+  return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
+}
+
+/**
+ * hb_font_funcs_set_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * Deprecated.  Use hb_font_funcs_set_nominal_glyph_func() and
+ * hb_font_funcs_set_variation_glyph_func() instead.
+ *
+ * Since: 0.9.2
+ * Deprecated: 1.2.3
+ **/
+void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+                              hb_font_get_glyph_func_t func,
+                              void *user_data, hb_destroy_func_t destroy)
+{
+  hb_font_get_glyph_trampoline_t *trampoline;
+
+  trampoline = trampoline_create (func, user_data, destroy);
+  if (unlikely (!trampoline))
+  {
+    if (destroy)
+      destroy (user_data);
+    return;
+  }
+
+  hb_font_funcs_set_nominal_glyph_func (ffuncs,
+                                        hb_font_get_nominal_glyph_trampoline,
+                                        trampoline,
+                                        trampoline_destroy);
+
+  trampoline_reference (&trampoline->closure);
+  hb_font_funcs_set_variation_glyph_func (ffuncs,
+                                          hb_font_get_variation_glyph_trampoline,
+                                          trampoline,
+                                          trampoline_destroy);
+}
+
+#endif /* HB_DISABLE_DEPRECATED */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
index 21049ca4a29..da9a3a7543c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
@@ -46,19 +46,19 @@ typedef struct hb_font_t hb_font_t;
 
 typedef struct hb_font_funcs_t hb_font_funcs_t;
 
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
 hb_font_funcs_create (void);
 
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
 hb_font_funcs_get_empty (void);
 
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
 hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
 
-void
+HB_EXTERN void
 hb_font_funcs_destroy (hb_font_funcs_t *ffuncs);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
                              hb_user_data_key_t *key,
                              void *              data,
@@ -66,19 +66,37 @@ hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
                              hb_bool_t           replace);
 
 
-void *
+HB_EXTERN void *
 hb_font_funcs_get_user_data (hb_font_funcs_t    *ffuncs,
                              hb_user_data_key_t *key);
 
 
-void
+HB_EXTERN void
 hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
 
 
-/* glyph extents */
+/* font and glyph extents */
+
+/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
+typedef struct hb_font_extents_t
+{
+  hb_position_t ascender; /* typographic ascender. */
+  hb_position_t descender; /* typographic descender. */
+  hb_position_t line_gap; /* suggested line spacing gap. */
+  /*< private >*/
+  hb_position_t reserved9;
+  hb_position_t reserved8;
+  hb_position_t reserved7;
+  hb_position_t reserved6;
+  hb_position_t reserved5;
+  hb_position_t reserved4;
+  hb_position_t reserved3;
+  hb_position_t reserved2;
+  hb_position_t reserved1;
+} hb_font_extents_t;
 
 /* Note that height is negative in coordinate systems that grow up. */
 typedef struct hb_glyph_extents_t
@@ -89,13 +107,23 @@ typedef struct hb_glyph_extents_t
   hb_position_t height; /* distance from top to bottom side. */
 } hb_glyph_extents_t;
 
-
 /* func types */
 
-typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
-                                               hb_codepoint_t unicode, hb_codepoint_t variation_selector,
-                                               hb_codepoint_t *glyph,
-                                               void *user_data);
+typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
+                                                       hb_font_extents_t *metrics,
+                                                       void *user_data);
+typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
+
+
+typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
+                                                       hb_codepoint_t unicode,
+                                                       hb_codepoint_t *glyph,
+                                                       void *user_data);
+typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
+                                                         hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                                                         hb_codepoint_t *glyph,
+                                                         void *user_data);
 
 
 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
@@ -141,7 +169,7 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
 /* func setters */
 
 /**
- * hb_font_funcs_set_glyph_func:
+ * hb_font_funcs_set_font_h_extents_func:
  * @ffuncs: font functions.
  * @func: (closure user_data) (destroy destroy) (scope notified):
  * @user_data:
@@ -149,12 +177,60 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
  *
  *
  *
- * Since: 0.9.2
+ * Since: 1.1.2
  **/
-void
-hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
-                              hb_font_get_glyph_func_t func,
-                              void *user_data, hb_destroy_func_t destroy);
+HB_EXTERN void
+hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
+                                       hb_font_get_font_h_extents_func_t func,
+                                       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_font_v_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
+                                       hb_font_get_font_v_extents_func_t func,
+                                       void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_nominal_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
+                                      hb_font_get_nominal_glyph_func_t func,
+                                      void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_variation_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
+                                        hb_font_get_variation_glyph_func_t func,
+                                        void *user_data, hb_destroy_func_t destroy);
 
 /**
  * hb_font_funcs_set_glyph_h_advance_func:
@@ -167,7 +243,7 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
                                         hb_font_get_glyph_h_advance_func_t func,
                                         void *user_data, hb_destroy_func_t destroy);
@@ -183,7 +259,7 @@ hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
                                         hb_font_get_glyph_v_advance_func_t func,
                                         void *user_data, hb_destroy_func_t destroy);
@@ -199,7 +275,7 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
                                        hb_font_get_glyph_h_origin_func_t func,
                                        void *user_data, hb_destroy_func_t destroy);
@@ -215,7 +291,7 @@ hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
                                        hb_font_get_glyph_v_origin_func_t func,
                                        void *user_data, hb_destroy_func_t destroy);
@@ -231,7 +307,7 @@ hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
                                         hb_font_get_glyph_h_kerning_func_t func,
                                         void *user_data, hb_destroy_func_t destroy);
@@ -247,7 +323,7 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
                                         hb_font_get_glyph_v_kerning_func_t func,
                                         void *user_data, hb_destroy_func_t destroy);
@@ -263,7 +339,7 @@ hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
                                       hb_font_get_glyph_extents_func_t func,
                                       void *user_data, hb_destroy_func_t destroy);
@@ -279,7 +355,7 @@ hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
                                             hb_font_get_glyph_contour_point_func_t func,
                                             void *user_data, hb_destroy_func_t destroy);
@@ -295,7 +371,7 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
                                    hb_font_get_glyph_name_func_t func,
                                    void *user_data, hb_destroy_func_t destroy);
@@ -311,57 +387,67 @@ hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
                                         hb_font_get_glyph_from_name_func_t func,
                                         void *user_data, hb_destroy_func_t destroy);
 
-
 /* func dispatch */
 
-hb_bool_t
-hb_font_get_glyph (hb_font_t *font,
-                   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
-                   hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+                       hb_font_extents_t *extents);
+HB_EXTERN hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+                       hb_font_extents_t *extents);
 
-hb_position_t
+HB_EXTERN hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+                           hb_codepoint_t unicode,
+                           hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+                             hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                             hb_codepoint_t *glyph);
+
+HB_EXTERN hb_position_t
 hb_font_get_glyph_h_advance (hb_font_t *font,
                              hb_codepoint_t glyph);
-hb_position_t
+HB_EXTERN hb_position_t
 hb_font_get_glyph_v_advance (hb_font_t *font,
                              hb_codepoint_t glyph);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_h_origin (hb_font_t *font,
                             hb_codepoint_t glyph,
                             hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_v_origin (hb_font_t *font,
                             hb_codepoint_t glyph,
                             hb_position_t *x, hb_position_t *y);
 
-hb_position_t
+HB_EXTERN hb_position_t
 hb_font_get_glyph_h_kerning (hb_font_t *font,
                              hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
-hb_position_t
+HB_EXTERN hb_position_t
 hb_font_get_glyph_v_kerning (hb_font_t *font,
                              hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_extents (hb_font_t *font,
                            hb_codepoint_t glyph,
                            hb_glyph_extents_t *extents);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_contour_point (hb_font_t *font,
                                  hb_codepoint_t glyph, unsigned int point_index,
                                  hb_position_t *x, hb_position_t *y);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_name (hb_font_t *font,
                         hb_codepoint_t glyph,
                         char *name, unsigned int size);
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_from_name (hb_font_t *font,
                              const char *name, int len, /* -1 means nul-terminated */
                              hb_codepoint_t *glyph);
@@ -369,52 +455,63 @@ hb_font_get_glyph_from_name (hb_font_t *font,
 
 /* high-level funcs, with fallback */
 
-void
+/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
+ * otherwise callse hb_font_get_variation_glyph(). */
+HB_EXTERN hb_bool_t
+hb_font_get_glyph (hb_font_t *font,
+                   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+                   hb_codepoint_t *glyph);
+
+HB_EXTERN void
+hb_font_get_extents_for_direction (hb_font_t *font,
+                                   hb_direction_t direction,
+                                   hb_font_extents_t *extents);
+HB_EXTERN void
 hb_font_get_glyph_advance_for_direction (hb_font_t *font,
                                          hb_codepoint_t glyph,
                                          hb_direction_t direction,
                                          hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
 hb_font_get_glyph_origin_for_direction (hb_font_t *font,
                                         hb_codepoint_t glyph,
                                         hb_direction_t direction,
                                         hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
 hb_font_add_glyph_origin_for_direction (hb_font_t *font,
                                         hb_codepoint_t glyph,
                                         hb_direction_t direction,
                                         hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
 hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
                                              hb_codepoint_t glyph,
                                              hb_direction_t direction,
                                              hb_position_t *x, hb_position_t *y);
 
-void
+HB_EXTERN void
 hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
                                          hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
                                          hb_direction_t direction,
                                          hb_position_t *x, hb_position_t *y);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_extents_for_origin (hb_font_t *font,
                                       hb_codepoint_t glyph,
                                       hb_direction_t direction,
                                       hb_glyph_extents_t *extents);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
                                             hb_codepoint_t glyph, unsigned int point_index,
                                             hb_direction_t direction,
                                             hb_position_t *x, hb_position_t *y);
 
 /* Generates gidDDD if glyph has no name. */
-void
+HB_EXTERN void
 hb_font_glyph_to_string (hb_font_t *font,
                          hb_codepoint_t glyph,
                          char *s, unsigned int size);
 /* Parses gidDDD and uniUUUU strings automatically. */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_glyph_from_string (hb_font_t *font,
                            const char *s, int len, /* -1 means nul-terminated */
                            hb_codepoint_t *glyph);
@@ -426,22 +523,22 @@ hb_font_glyph_from_string (hb_font_t *font,
 
 /* Fonts are very light-weight objects */
 
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_font_create (hb_face_t *face);
 
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_font_create_sub_font (hb_font_t *parent);
 
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_font_get_empty (void);
 
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_font_reference (hb_font_t *font);
 
-void
+HB_EXTERN void
 hb_font_destroy (hb_font_t *font);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_set_user_data (hb_font_t          *font,
                        hb_user_data_key_t *key,
                        void *              data,
@@ -449,46 +546,46 @@ hb_font_set_user_data (hb_font_t          *font,
                        hb_bool_t           replace);
 
 
-void *
+HB_EXTERN void *
 hb_font_get_user_data (hb_font_t          *font,
                        hb_user_data_key_t *key);
 
-void
+HB_EXTERN void
 hb_font_make_immutable (hb_font_t *font);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_font_is_immutable (hb_font_t *font);
 
-void
+HB_EXTERN void
 hb_font_set_parent (hb_font_t *font,
                     hb_font_t *parent);
 
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_font_get_parent (hb_font_t *font);
 
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_font_get_face (hb_font_t *font);
 
 
-void
+HB_EXTERN void
 hb_font_set_funcs (hb_font_t         *font,
                    hb_font_funcs_t   *klass,
                    void              *font_data,
                    hb_destroy_func_t  destroy);
 
 /* Be *very* careful with this function! */
-void
+HB_EXTERN void
 hb_font_set_funcs_data (hb_font_t         *font,
                         void              *font_data,
                         hb_destroy_func_t  destroy);
 
 
-void
+HB_EXTERN void
 hb_font_set_scale (hb_font_t *font,
                    int x_scale,
                    int y_scale);
 
-void
+HB_EXTERN void
 hb_font_get_scale (hb_font_t *font,
                    int *x_scale,
                    int *y_scale);
@@ -496,12 +593,12 @@ hb_font_get_scale (hb_font_t *font,
 /*
  * A zero value means "no hinting in that direction"
  */
-void
+HB_EXTERN void
 hb_font_set_ppem (hb_font_t *font,
                   unsigned int x_ppem,
                   unsigned int y_ppem);
 
-void
+HB_EXTERN void
 hb_font_get_ppem (hb_font_t *font,
                   unsigned int *x_ppem,
                   unsigned int *y_ppem);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
index 5a8eb2f1a57..fb3c1dfbcf0 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
@@ -70,11 +70,12 @@ struct hb_ft_font_t
 {
   FT_Face ft_face;
   int load_flags;
+  bool symbol; /* Whether selected cmap is symbol cmap. */
   bool unref; /* Whether to destroy ft_face when done. */
 };
 
 static hb_ft_font_t *
-_hb_ft_font_create (FT_Face ft_face, bool unref)
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
 {
   hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
 
@@ -82,6 +83,7 @@ _hb_ft_font_create (FT_Face ft_face, bool unref)
     return NULL;
 
   ft_font->ft_face = ft_face;
+  ft_font->symbol = symbol;
   ft_font->unref = unref;
 
   ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
@@ -89,11 +91,17 @@ _hb_ft_font_create (FT_Face ft_face, bool unref)
   return ft_font;
 }
 
+static void
+_hb_ft_face_destroy (FT_Face ft_face)
+{
+  FT_Done_Face (ft_face);
+}
+
 static void
 _hb_ft_font_destroy (hb_ft_font_t *ft_font)
 {
   if (ft_font->unref)
-    FT_Done_Face (ft_font->ft_face);
+    _hb_ft_face_destroy (ft_font->ft_face);
 
   free (ft_font);
 }
@@ -155,21 +163,46 @@ hb_ft_font_get_face (hb_font_t *font)
 
 
 static hb_bool_t
-hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
-                 void *font_data,
-                 hb_codepoint_t unicode,
-                 hb_codepoint_t variation_selector,
-                 hb_codepoint_t *glyph,
-                 void *user_data HB_UNUSED)
-
+hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+                         void *font_data,
+                         hb_codepoint_t unicode,
+                         hb_codepoint_t *glyph,
+                         void *user_data HB_UNUSED)
 {
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
-  unsigned int g;
+  unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
 
-  if (likely (!variation_selector))
-    g = FT_Get_Char_Index (ft_font->ft_face, unicode);
-  else
-    g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
+  if (unlikely (!g))
+  {
+    if (unlikely (ft_font->symbol) && unicode <= 0x00FFu)
+    {
+      /* For symbol-encoded OpenType fonts, we duplicate the
+       * U+F000..F0FF range at U+0000..U+00FF.  That's what
+       * Windows seems to do, and that's hinted about at:
+       * http://www.microsoft.com/typography/otspec/recom.htm
+       * under "Non-Standard (Symbol) Fonts". */
+      g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
+      if (!g)
+        return false;
+    }
+    else
+      return false;
+  }
+
+  *glyph = g;
+  return true;
+}
+
+static hb_bool_t
+hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
+                           void *font_data,
+                           hb_codepoint_t unicode,
+                           hb_codepoint_t variation_selector,
+                           hb_codepoint_t *glyph,
+                           void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
 
   if (unlikely (!g))
     return false;
@@ -216,18 +249,6 @@ hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
   return (-v + (1<<9)) >> 10;
 }
 
-static hb_bool_t
-hb_ft_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
-                          void *font_data HB_UNUSED,
-                          hb_codepoint_t glyph HB_UNUSED,
-                          hb_position_t *x HB_UNUSED,
-                          hb_position_t *y HB_UNUSED,
-                          void *user_data HB_UNUSED)
-{
-  /* We always work in the horizontal coordinates. */
-  return true;
-}
-
 static hb_bool_t
 hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
                           void *font_data,
@@ -272,17 +293,6 @@ hb_ft_get_glyph_h_kerning (hb_font_t *font,
   return kerningv.x;
 }
 
-static hb_position_t
-hb_ft_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
-                           void *font_data HB_UNUSED,
-                           hb_codepoint_t top_glyph HB_UNUSED,
-                           hb_codepoint_t bottom_glyph HB_UNUSED,
-                           void *user_data HB_UNUSED)
-{
-  /* FreeType API doesn't support vertical kerning */
-  return 0;
-}
-
 static hb_bool_t
 hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
                          void *font_data,
@@ -300,6 +310,16 @@ hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
   extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
   extents->width = ft_face->glyph->metrics.width;
   extents->height = -ft_face->glyph->metrics.height;
+  if (font->x_scale < 0)
+  {
+    extents->x_bearing = -extents->x_bearing;
+    extents->width = -extents->width;
+  }
+  if (font->y_scale < 0)
+  {
+    extents->y_bearing = -extents->y_bearing;
+    extents->height = -extents->height;
+  }
   return true;
 }
 
@@ -379,25 +399,78 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED,
   return *glyph != 0;
 }
 
+static hb_bool_t
+hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
+                          void *font_data,
+                          hb_font_extents_t *metrics,
+                          void *user_data HB_UNUSED)
+{
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+  FT_Face ft_face = ft_font->ft_face;
+  metrics->ascender = ft_face->size->metrics.ascender;
+  metrics->descender = ft_face->size->metrics.descender;
+  metrics->line_gap = ft_face->size->metrics.height - (ft_face->size->metrics.ascender - ft_face->size->metrics.descender);
+  if (font->y_scale < 0)
+  {
+    metrics->ascender = -metrics->ascender;
+    metrics->descender = -metrics->descender;
+    metrics->line_gap = -metrics->line_gap;
+  }
+  return true;
+}
+
+static hb_font_funcs_t *static_ft_funcs = NULL;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ft_funcs (void)
+{
+  hb_font_funcs_destroy (static_ft_funcs);
+}
+#endif
 
 static void
 _hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
 {
-  static const hb_font_funcs_t ft_ffuncs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs);
 
-    true, /* immutable */
+  if (unlikely (!funcs))
+  {
+    funcs = hb_font_funcs_create ();
 
-    {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ft_get_##name,
-      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, NULL, NULL);
+    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, NULL, NULL);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, NULL, NULL);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, NULL, NULL);
+    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, NULL, NULL);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, NULL, NULL);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, NULL, NULL);
+    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, NULL, NULL);
+    hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, NULL, NULL);
+    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, NULL, NULL);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, NULL, NULL);
+    hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, NULL, NULL);
+    hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, NULL, NULL);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, NULL, NULL);
+
+    hb_font_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, NULL, funcs)) {
+      hb_font_funcs_destroy (funcs);
+      goto retry;
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_ft_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
+  bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
   hb_font_set_funcs (font,
-                     const_cast (&ft_ffuncs),
-                     _hb_ft_font_create (ft_face, unref),
+                     funcs,
+                     _hb_ft_font_create (ft_face, symbol, unref),
                      (hb_destroy_func_t) _hb_ft_font_destroy);
 }
 
@@ -477,7 +550,7 @@ hb_face_t *
 hb_ft_face_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+  return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
 }
 
 static void
@@ -557,7 +630,7 @@ hb_font_t *
 hb_ft_font_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+  return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
 }
 
 
@@ -626,7 +699,8 @@ hb_ft_font_set_funcs (hb_font_t *font)
     return;
   }
 
-  FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
+  if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE))
+    FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL);
 
   FT_Set_Char_Size (ft_face,
                     abs (font->x_scale), abs (font->y_scale),
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
index 368c317a083..196b045773a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
@@ -59,7 +59,7 @@ HB_BEGIN_DECLS
  * probably should use (the more recent) hb_ft_face_create_referenced()
  * instead.
  */
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_ft_face_create (FT_Face           ft_face,
                    hb_destroy_func_t destroy);
 
@@ -71,7 +71,7 @@ hb_ft_face_create (FT_Face           ft_face,
  * Client is still responsible for making sure that ft-face is destroyed
  * after hb-face is.
  */
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_ft_face_create_cached (FT_Face ft_face);
 
 /* This version is like hb_ft_face_create(), except that it calls
@@ -81,7 +81,7 @@ hb_ft_face_create_cached (FT_Face ft_face);
  * This is the most convenient version to use.  Use it unless you have
  * very good reasons not to.
  */
-hb_face_t *
+HB_EXTERN hb_face_t *
 hb_ft_face_create_referenced (FT_Face ft_face);
 
 
@@ -98,26 +98,26 @@ hb_ft_face_create_referenced (FT_Face ft_face);
 
 /* See notes on hb_ft_face_create().  Same issues re lifecycle-management
  * apply here.  Use hb_ft_font_create_referenced() if you can. */
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_ft_font_create (FT_Face           ft_face,
                    hb_destroy_func_t destroy);
 
 /* See notes on hb_ft_face_create_referenced() re lifecycle-management
  * issues. */
-hb_font_t *
+HB_EXTERN hb_font_t *
 hb_ft_font_create_referenced (FT_Face ft_face);
 
-FT_Face
+HB_EXTERN FT_Face
 hb_ft_font_get_face (hb_font_t *font);
 
-void
+HB_EXTERN void
 hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
 
-int
+HB_EXTERN int
 hb_ft_font_get_load_flags (hb_font_t *font);
 
 /* Makes an hb_font_t use FreeType internally to implement font functions. */
-void
+HB_EXTERN void
 hb_ft_font_set_funcs (hb_font_t *font);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
index 2d3b13c5236..943d96ca2e7 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
@@ -140,7 +140,7 @@ struct TTCHeaderVersion1
 
   protected:
   Tag           ttcTag;         /* TrueType Collection ID string: 'ttcf' */
-  FixedVersion  version;        /* Version of the TTC Header (1.0),
+  FixedVersion<>version;        /* Version of the TTC Header (1.0),
                                  * 0x00010000u */
   ArrayOf, ULONG>
                 table;          /* Array of offsets to the OffsetTable for each font
@@ -187,7 +187,7 @@ struct TTCHeader
   union {
   struct {
   Tag           ttcTag;         /* TrueType Collection ID string: 'ttcf' */
-  FixedVersion  version;        /* Version of the TTC Header (1.0 or 2.0),
+  FixedVersion<>version;        /* Version of the TTC Header (1.0 or 2.0),
                                  * 0x00010000u or 0x00020000u */
   }                     header;
   TTCHeaderVersion1     version1;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
index 6b3520cf071..27c5f1703cd 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
@@ -101,10 +101,8 @@ static inline Type& StructAfter(TObject &X)
 #define DEFINE_SIZE_STATIC(size) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
   static const unsigned int static_size = (size); \
-  static const unsigned int min_size = (size)
-
-/* Size signifying variable-sized array */
-#define VAR 1
+  static const unsigned int min_size = (size); \
+  inline unsigned int get_size (void) const { return (size); }
 
 #define DEFINE_SIZE_UNION(size, _member) \
   DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
@@ -185,7 +183,7 @@ struct hb_dispatch_context_t
 
 /* This limits sanitizing time on really broken fonts. */
 #ifndef HB_SANITIZE_MAX_EDITS
-#define HB_SANITIZE_MAX_EDITS 100
+#define HB_SANITIZE_MAX_EDITS 32
 #endif
 
 struct hb_sanitize_context_t :
@@ -399,9 +397,9 @@ struct Sanitizer
 
 struct hb_serialize_context_t
 {
-  inline hb_serialize_context_t (void *start, unsigned int size)
+  inline hb_serialize_context_t (void *start_, unsigned int size)
   {
-    this->start = (char *) start;
+    this->start = (char *) start_;
     this->end = this->start + size;
 
     this->ran_out_of_room = false;
@@ -495,10 +493,10 @@ struct hb_serialize_context_t
     return reinterpret_cast (&obj);
   }
 
-  inline void truncate (void *head)
+  inline void truncate (void *new_head)
   {
-    assert (this->start < head && head <= this->head);
-    this->head = (char *) head;
+    assert (this->start < new_head && new_head <= this->head);
+    this->head = (char *) new_head;
   }
 
   unsigned int debug_depth;
@@ -665,6 +663,24 @@ typedef SHORT FWORD;
 /* 16-bit unsigned integer (USHORT) that describes a quantity in FUnits. */
 typedef USHORT UFWORD;
 
+/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
+struct F2DOT14 : SHORT
+{
+  //inline float to_float (void) const { return ???; }
+  //inline void set_float (float f) { v.set (f * ???); }
+  public:
+  DEFINE_SIZE_STATIC (2);
+};
+
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed: LONG
+{
+  //inline float to_float (void) const { return ???; }
+  //inline void set_float (float f) { v.set (f * ???); }
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
 /* Date represented in number of seconds since 12:00 midnight, January 1,
  * 1904. The value is represented as a signed 64-bit integer. */
 struct LONGDATETIME
@@ -742,9 +758,10 @@ struct CheckSum : ULONG
  * Version Numbers
  */
 
+template 
 struct FixedVersion
 {
-  inline uint32_t to_int (void) const { return (major << 16) + minor; }
+  inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -752,10 +769,10 @@ struct FixedVersion
     return_trace (c->check_struct (this));
   }
 
-  USHORT major;
-  USHORT minor;
+  FixedType major;
+  FixedType minor;
   public:
-  DEFINE_SIZE_STATIC (4);
+  DEFINE_SIZE_STATIC (2 * sizeof(FixedType));
 };
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
index b0e2f36a436..7827c09a57c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
@@ -69,61 +69,78 @@ struct CmapSubtableFormat0
 
 struct CmapSubtableFormat4
 {
-  inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  struct accelerator_t
   {
-    unsigned int segCount;
+    inline void init (const CmapSubtableFormat4 *subtable)
+    {
+      segCount = subtable->segCountX2 / 2;
+      endCount = subtable->values;
+      startCount = endCount + segCount + 1;
+      idDelta = startCount + segCount;
+      idRangeOffset = idDelta + segCount;
+      glyphIdArray = idRangeOffset + segCount;
+      glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
+    }
+
+    static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+    {
+      const accelerator_t *thiz = (const accelerator_t *) obj;
+
+      /* Custom two-array bsearch. */
+      int min = 0, max = (int) thiz->segCount - 1;
+      const USHORT *startCount = thiz->startCount;
+      const USHORT *endCount = thiz->endCount;
+      unsigned int i;
+      while (min <= max)
+      {
+        int mid = (min + max) / 2;
+        if (codepoint < startCount[mid])
+          max = mid - 1;
+        else if (codepoint > endCount[mid])
+          min = mid + 1;
+        else
+        {
+          i = mid;
+          goto found;
+        }
+      }
+      return false;
+
+    found:
+      hb_codepoint_t gid;
+      unsigned int rangeOffset = thiz->idRangeOffset[i];
+      if (rangeOffset == 0)
+        gid = codepoint + thiz->idDelta[i];
+      else
+      {
+        /* Somebody has been smoking... */
+        unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount;
+        if (unlikely (index >= thiz->glyphIdArrayLength))
+          return false;
+        gid = thiz->glyphIdArray[index];
+        if (unlikely (!gid))
+          return false;
+        gid += thiz->idDelta[i];
+      }
+
+      *glyph = gid & 0xFFFFu;
+      return true;
+    }
+
     const USHORT *endCount;
     const USHORT *startCount;
     const USHORT *idDelta;
     const USHORT *idRangeOffset;
     const USHORT *glyphIdArray;
+    unsigned int segCount;
     unsigned int glyphIdArrayLength;
+  };
 
-    segCount = this->segCountX2 / 2;
-    endCount = this->values;
-    startCount = endCount + segCount + 1;
-    idDelta = startCount + segCount;
-    idRangeOffset = idDelta + segCount;
-    glyphIdArray = idRangeOffset + segCount;
-    glyphIdArrayLength = (this->length - 16 - 8 * segCount) / 2;
-
-    /* Custom two-array bsearch. */
-    int min = 0, max = (int) segCount - 1;
-    unsigned int i;
-    while (min <= max)
-    {
-      int mid = (min + max) / 2;
-      if (codepoint < startCount[mid])
-        max = mid - 1;
-      else if (codepoint > endCount[mid])
-        min = mid + 1;
-      else
-      {
-        i = mid;
-        goto found;
-      }
-    }
-    return false;
-
-  found:
-    hb_codepoint_t gid;
-    unsigned int rangeOffset = idRangeOffset[i];
-    if (rangeOffset == 0)
-      gid = codepoint + idDelta[i];
-    else
-    {
-      /* Somebody has been smoking... */
-      unsigned int index = rangeOffset / 2 + (codepoint - startCount[i]) + i - segCount;
-      if (unlikely (index >= glyphIdArrayLength))
-        return false;
-      gid = glyphIdArray[index];
-      if (unlikely (!gid))
-        return false;
-      gid += idDelta[i];
-    }
-
-    *glyph = gid & 0xFFFFu;
-    return true;
+  inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+  {
+    accelerator_t accel;
+    accel.init (this);
+    return accel.get_glyph_func (&accel, codepoint, glyph);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -388,7 +405,7 @@ struct CmapSubtableFormat14
   }
 
   protected:
-  USHORT        format;         /* Format number is set to 0. */
+  USHORT        format;         /* Format number is set to 14. */
   ULONG         lengthZ;        /* Byte length of this subtable. */
   SortedArrayOf
                 record;         /* Variation selector records; sorted
@@ -416,16 +433,6 @@ struct CmapSubtable
     }
   }
 
-  inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
-                                            hb_codepoint_t variation_selector,
-                                            hb_codepoint_t *glyph) const
-  {
-    switch (u.format) {
-    case 14: return u.format14.get_glyph_variant(codepoint, variation_selector, glyph);
-    default: return GLYPH_VARIANT_NOT_FOUND;
-    }
-  }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -442,7 +449,7 @@ struct CmapSubtable
     }
   }
 
-  protected:
+  public:
   union {
   USHORT                format;         /* Format identifier */
   CmapSubtableFormat0   format0;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
index 836c3bf0e85..3c63f336a6b 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
@@ -35,6 +35,8 @@
 #include "hb-ot-head-table.hh"
 #include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
+#include "hb-ot-os2-table.hh"
+//#include "hb-ot-post-table.hh"
 
 
 struct hb_ot_face_metrics_accelerator_t
@@ -42,24 +44,58 @@ struct hb_ot_face_metrics_accelerator_t
   unsigned int num_metrics;
   unsigned int num_advances;
   unsigned int default_advance;
+  unsigned short ascender;
+  unsigned short descender;
+  unsigned short line_gap;
+
   const OT::_mtx *table;
   hb_blob_t *blob;
 
   inline void init (hb_face_t *face,
-                    hb_tag_t _hea_tag, hb_tag_t _mtx_tag,
-                    unsigned int default_advance_)
+                    hb_tag_t _hea_tag,
+                    hb_tag_t _mtx_tag,
+                    hb_tag_t os2_tag)
   {
-    this->default_advance = default_advance_;
-    this->num_metrics = face->get_num_glyphs ();
+    this->default_advance = face->get_upem ();
+
+    bool got_font_extents = false;
+    if (os2_tag)
+    {
+      hb_blob_t *os2_blob = OT::Sanitizer::sanitize (face->reference_table (os2_tag));
+      const OT::os2 *os2 = OT::Sanitizer::lock_instance (os2_blob);
+#define USE_TYPO_METRICS (1u<<7)
+      if (0 != (os2->fsSelection & USE_TYPO_METRICS))
+      {
+        this->ascender = os2->sTypoAscender;
+        this->descender = os2->sTypoDescender;
+        this->line_gap = os2->sTypoLineGap;
+        got_font_extents = (this->ascender | this->descender) != 0;
+      }
+      hb_blob_destroy (os2_blob);
+    }
 
     hb_blob_t *_hea_blob = OT::Sanitizer::sanitize (face->reference_table (_hea_tag));
     const OT::_hea *_hea = OT::Sanitizer::lock_instance (_hea_blob);
     this->num_advances = _hea->numberOfLongMetrics;
+    if (!got_font_extents)
+    {
+      this->ascender = _hea->ascender;
+      this->descender = _hea->descender;
+      this->line_gap = _hea->lineGap;
+    }
     hb_blob_destroy (_hea_blob);
 
     this->blob = OT::Sanitizer::sanitize (face->reference_table (_mtx_tag));
-    if (unlikely (!this->num_advances ||
-                  2 * (this->num_advances + this->num_metrics) > hb_blob_get_length (this->blob)))
+
+    /* Cap num_metrics() and num_advances() based on table length. */
+    unsigned int len = hb_blob_get_length (this->blob);
+    if (unlikely (this->num_advances * 4 > len))
+      this->num_advances = len / 4;
+    this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2;
+
+    /* We MUST set num_metrics to zero if num_advances is zero.
+     * Our get_advance() depends on that. */
+    if (unlikely (!this->num_advances))
     {
       this->num_metrics = this->num_advances = 0;
       hb_blob_destroy (this->blob);
@@ -166,10 +202,48 @@ struct hb_ot_face_glyf_accelerator_t
   }
 };
 
+typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
+                                          hb_codepoint_t codepoint,
+                                          hb_codepoint_t *glyph);
+
+template 
+static inline bool get_glyph_from (const void *obj,
+                                   hb_codepoint_t codepoint,
+                                   hb_codepoint_t *glyph)
+{
+  const Type *typed_obj = (const Type *) obj;
+  return typed_obj->get_glyph (codepoint, glyph);
+}
+
+template 
+static inline bool get_glyph_from_symbol (const void *obj,
+                                          hb_codepoint_t codepoint,
+                                          hb_codepoint_t *glyph)
+{
+  const Type *typed_obj = (const Type *) obj;
+  if (likely (typed_obj->get_glyph (codepoint, glyph)))
+    return true;
+
+  if (codepoint <= 0x00FFu)
+  {
+    /* For symbol-encoded OpenType fonts, we duplicate the
+     * U+F000..F0FF range at U+0000..U+00FF.  That's what
+     * Windows seems to do, and that's hinted about at:
+     * http://www.microsoft.com/typography/otspec/recom.htm
+     * under "Non-Standard (Symbol) Fonts". */
+    return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+  }
+
+  return false;
+}
+
 struct hb_ot_face_cmap_accelerator_t
 {
-  const OT::CmapSubtable *table;
-  const OT::CmapSubtable *uvs_table;
+  hb_cmap_get_glyph_func_t get_glyph_func;
+  const void *get_glyph_data;
+  OT::CmapSubtableFormat4::accelerator_t format4_accel;
+
+  const OT::CmapSubtableFormat14 *uvs_table;
   hb_blob_t *blob;
 
   inline void init (hb_face_t *face)
@@ -177,8 +251,9 @@ struct hb_ot_face_cmap_accelerator_t
     this->blob = OT::Sanitizer::sanitize (face->reference_table (HB_OT_TAG_cmap));
     const OT::cmap *cmap = OT::Sanitizer::lock_instance (this->blob);
     const OT::CmapSubtable *subtable = NULL;
-    const OT::CmapSubtable *subtable_uvs = NULL;
+    const OT::CmapSubtableFormat14 *subtable_uvs = NULL;
 
+    bool symbol = false;
     /* 32-bit subtables. */
     if (!subtable) subtable = cmap->find_subtable (3, 10);
     if (!subtable) subtable = cmap->find_subtable (0, 6);
@@ -189,17 +264,38 @@ struct hb_ot_face_cmap_accelerator_t
     if (!subtable) subtable = cmap->find_subtable (0, 2);
     if (!subtable) subtable = cmap->find_subtable (0, 1);
     if (!subtable) subtable = cmap->find_subtable (0, 0);
-    if (!subtable) subtable = cmap->find_subtable (3, 0);
+    if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true);
     /* Meh. */
     if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
 
     /* UVS subtable. */
-    if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5);
+    if (!subtable_uvs)
+    {
+      const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
+      if (st && st->u.format == 14)
+        subtable_uvs = &st->u.format14;
+    }
     /* Meh. */
-    if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable);
+    if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
 
-    this->table = subtable;
     this->uvs_table = subtable_uvs;
+
+    this->get_glyph_data = subtable;
+    if (unlikely (symbol))
+      this->get_glyph_func = get_glyph_from_symbol;
+    else
+      switch (subtable->u.format) {
+      /* Accelerate format 4 and format 12. */
+      default: this->get_glyph_func = get_glyph_from;         break;
+      case 12: this->get_glyph_func = get_glyph_from; break;
+      case  4:
+        {
+          this->format4_accel.init (&subtable->u.format4);
+          this->get_glyph_data = &this->format4_accel;
+          this->get_glyph_func = this->format4_accel.get_glyph_func;
+        }
+        break;
+      }
   }
 
   inline void fini (void)
@@ -207,33 +303,77 @@ struct hb_ot_face_cmap_accelerator_t
     hb_blob_destroy (this->blob);
   }
 
-  inline bool get_glyph (hb_codepoint_t  unicode,
-                         hb_codepoint_t  variation_selector,
-                         hb_codepoint_t *glyph) const
+  inline bool get_nominal_glyph (hb_codepoint_t  unicode,
+                                 hb_codepoint_t *glyph) const
   {
-    if (unlikely (variation_selector))
+    return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
+  }
+
+  inline bool get_variation_glyph (hb_codepoint_t  unicode,
+                                   hb_codepoint_t  variation_selector,
+                                   hb_codepoint_t *glyph) const
+  {
+    switch (this->uvs_table->get_glyph_variant (unicode,
+                                                variation_selector,
+                                                glyph))
     {
-      switch (this->uvs_table->get_glyph_variant (unicode,
-                                                  variation_selector,
-                                                  glyph))
-      {
-        case OT::GLYPH_VARIANT_NOT_FOUND:       return false;
-        case OT::GLYPH_VARIANT_FOUND:           return true;
-        case OT::GLYPH_VARIANT_USE_DEFAULT:     break;
-      }
+      case OT::GLYPH_VARIANT_NOT_FOUND:         return false;
+      case OT::GLYPH_VARIANT_FOUND:             return true;
+      case OT::GLYPH_VARIANT_USE_DEFAULT:       break;
     }
 
-    return this->table->get_glyph (unicode, glyph);
+    return get_nominal_glyph (unicode, glyph);
   }
 };
 
+template 
+struct hb_lazy_loader_t
+{
+  inline void init (hb_face_t *face_)
+  {
+    face = face_;
+    instance = NULL;
+  }
+
+  inline void fini (void)
+  {
+    if (instance && instance != &OT::Null(T))
+    {
+      instance->fini();
+      free (instance);
+    }
+  }
+
+  inline const T* operator-> (void) const
+  {
+  retry:
+    T *p = (T *) hb_atomic_ptr_get (&instance);
+    if (unlikely (!p))
+    {
+      p = (T *) calloc (1, sizeof (T));
+      if (unlikely (!p))
+        return &OT::Null(T);
+      p->init (face);
+      if (unlikely (!hb_atomic_ptr_cmpexch (const_cast(&instance), NULL, p)))
+      {
+        p->fini ();
+        goto retry;
+      }
+    }
+    return p;
+  }
+
+  private:
+  hb_face_t *face;
+  T *instance;
+};
 
 struct hb_ot_font_t
 {
   hb_ot_face_cmap_accelerator_t cmap;
   hb_ot_face_metrics_accelerator_t h_metrics;
   hb_ot_face_metrics_accelerator_t v_metrics;
-  hb_ot_face_glyf_accelerator_t glyf;
+  hb_lazy_loader_t glyf;
 };
 
 
@@ -245,11 +385,9 @@ _hb_ot_font_create (hb_face_t *face)
   if (unlikely (!ot_font))
     return NULL;
 
-  unsigned int upem = face->get_upem ();
-
   ot_font->cmap.init (face);
-  ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1);
-  ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */
+  ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_os2);
+  ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_TAG_NONE); /* TODO Can we do this lazily? */
   ot_font->glyf.init (face);
 
   return ot_font;
@@ -268,16 +406,27 @@ _hb_ot_font_destroy (hb_ot_font_t *ot_font)
 
 
 static hb_bool_t
-hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
-                 void *font_data,
-                 hb_codepoint_t unicode,
-                 hb_codepoint_t variation_selector,
-                 hb_codepoint_t *glyph,
-                 void *user_data HB_UNUSED)
+hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+                         void *font_data,
+                         hb_codepoint_t unicode,
+                         hb_codepoint_t *glyph,
+                         void *user_data HB_UNUSED)
 
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-  return ot_font->cmap.get_glyph (unicode, variation_selector, glyph);
+  return ot_font->cmap.get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED,
+                           void *font_data,
+                           hb_codepoint_t unicode,
+                           hb_codepoint_t variation_selector,
+                           hb_codepoint_t *glyph,
+                           void *user_data HB_UNUSED)
+{
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph);
 }
 
 static hb_position_t
@@ -300,52 +449,6 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
   return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph));
 }
 
-static hb_bool_t
-hb_ot_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
-                          void *font_data HB_UNUSED,
-                          hb_codepoint_t glyph HB_UNUSED,
-                          hb_position_t *x HB_UNUSED,
-                          hb_position_t *y HB_UNUSED,
-                          void *user_data HB_UNUSED)
-{
-  /* We always work in the horizontal coordinates. */
-  return true;
-}
-
-static hb_bool_t
-hb_ot_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
-                          void *font_data,
-                          hb_codepoint_t glyph,
-                          hb_position_t *x,
-                          hb_position_t *y,
-                          void *user_data HB_UNUSED)
-{
-  /* TODO */
-  return false;
-}
-
-static hb_position_t
-hb_ot_get_glyph_h_kerning (hb_font_t *font,
-                           void *font_data,
-                           hb_codepoint_t left_glyph,
-                           hb_codepoint_t right_glyph,
-                           void *user_data HB_UNUSED)
-{
-  /* TODO */
-  return 0;
-}
-
-static hb_position_t
-hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
-                           void *font_data HB_UNUSED,
-                           hb_codepoint_t top_glyph HB_UNUSED,
-                           hb_codepoint_t bottom_glyph HB_UNUSED,
-                           void *user_data HB_UNUSED)
-{
-  /* OpenType doesn't have vertical-kerning other than GPOS. */
-  return 0;
-}
-
 static hb_bool_t
 hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
                          void *font_data,
@@ -354,7 +457,7 @@ hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
                          void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-  bool ret = ot_font->glyf.get_extents (glyph, extents);
+  bool ret = ot_font->glyf->get_extents (glyph, extents);
   extents->x_bearing = font->em_scale_x (extents->x_bearing);
   extents->y_bearing = font->em_scale_y (extents->y_bearing);
   extents->width     = font->em_scale_x (extents->width);
@@ -363,61 +466,85 @@ hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
 }
 
 static hb_bool_t
-hb_ot_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
-                               void *font_data,
-                               hb_codepoint_t glyph,
-                               unsigned int point_index,
-                               hb_position_t *x,
-                               hb_position_t *y,
-                               void *user_data HB_UNUSED)
+hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
+                          void *font_data,
+                          hb_font_extents_t *metrics,
+                          void *user_data HB_UNUSED)
 {
-  /* TODO */
-  return false;
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender);
+  metrics->descender = font->em_scale_y (ot_font->h_metrics.descender);
+  metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap);
+  return true;
 }
 
 static hb_bool_t
-hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
-                      void *font_data,
-                      hb_codepoint_t glyph,
-                      char *name, unsigned int size,
-                      void *user_data HB_UNUSED)
+hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
+                          void *font_data,
+                          hb_font_extents_t *metrics,
+                          void *user_data HB_UNUSED)
 {
-  /* TODO */
-  return false;
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender);
+  metrics->descender = font->em_scale_x (ot_font->v_metrics.descender);
+  metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap);
+  return true;
 }
 
-static hb_bool_t
-hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
-                           void *font_data,
-                           const char *name, int len, /* -1 means nul-terminated */
-                           hb_codepoint_t *glyph,
-                           void *user_data HB_UNUSED)
-{
-  /* TODO */
-  return false;
-}
+static hb_font_funcs_t *static_ot_funcs = NULL;
 
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ot_funcs (void)
+{
+  hb_font_funcs_destroy (static_ot_funcs);
+}
+#endif
 
 static hb_font_funcs_t *
 _hb_ot_get_font_funcs (void)
 {
-  static const hb_font_funcs_t ot_ffuncs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs);
 
-    true, /* immutable */
+  if (unlikely (!funcs))
+  {
+    funcs = hb_font_funcs_create ();
 
-    {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ot_get_##name,
-      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL);
+    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL);
+    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL);
+    //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL);
+    //hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO
+    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL);
+    //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO
+    //hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO
+    //hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO
+
+    hb_font_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) {
+      hb_font_funcs_destroy (funcs);
+      goto retry;
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_ot_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
-  return const_cast (&ot_ffuncs);
+  return funcs;
 }
 
 
 /**
+ * hb_ot_font_set_funcs:
+ *
  * Since: 0.9.28
  **/
 void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
index b9947a16bc8..80eaa54b1ad 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
@@ -36,7 +36,7 @@
 HB_BEGIN_DECLS
 
 
-void
+HB_EXTERN void
 hb_ot_font_set_funcs (hb_font_t *font);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
index 616bd6650d8..cdb23939268 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
@@ -90,10 +90,10 @@ struct glyfGlyphHeader
                                          * greater than or equal to zero,
                                          * this is a simple glyph; if negative,
                                          * this is a composite glyph. */
-  SHORT         xMin;                   /* Minimum x for coordinate data. */
-  SHORT         yMin;                   /* Minimum y for coordinate data. */
-  SHORT         xMax;                   /* Maximum x for coordinate data. */
-  SHORT         yMax;                   /* Maximum y for coordinate data. */
+  FWORD         xMin;                   /* Minimum x for coordinate data. */
+  FWORD         yMin;                   /* Minimum y for coordinate data. */
+  FWORD         xMax;                   /* Maximum x for coordinate data. */
+  FWORD         yMax;                   /* Maximum y for coordinate data. */
 
   DEFINE_SIZE_STATIC (10);
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
index 3cd59fbf2dd..16d18c8f243 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
@@ -55,13 +55,15 @@ struct head
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && likely (version.major == 1));
+    return_trace (c->check_struct (this) &&
+                  version.major == 1 &&
+                  magicNumber == 0x5F0F3CF5u);
   }
 
   protected:
-  FixedVersion  version;                /* Version of the head table--currently
+  FixedVersion<>version;                /* Version of the head table--currently
                                          * 0x00010000u for version 1.0. */
-  FixedVersion  fontRevision;           /* Set by font manufacturer. */
+  FixedVersion<>fontRevision;           /* Set by font manufacturer. */
   ULONG         checkSumAdjustment;     /* To compute: set it to 0, sum the
                                          * entire font as ULONG, then store
                                          * 0xB1B0AFBAu - sum. */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
index ed65934fae4..c63f4668a42 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
@@ -56,7 +56,7 @@ struct _hea
   }
 
   public:
-  FixedVersion  version;                /* 0x00010000u for version 1.0. */
+  FixedVersion<>version;                /* 0x00010000u for version 1.0. */
   FWORD         ascender;               /* Typographic ascent. */
   FWORD         descender;              /* Typographic descent. */
   FWORD         lineGap;                /* Typographic line gap. */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
index cd266ffbee7..2ec501c3b79 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
@@ -44,8 +44,8 @@ namespace OT {
 
 struct LongMetric
 {
-  USHORT        advance; /* Advance width/height. */
-  SHORT         lsb; /* Leading (left/top) side bearing. */
+  UFWORD        advance; /* Advance width/height. */
+  FWORD         lsb; /* Leading (left/top) side bearing. */
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -74,7 +74,7 @@ struct _mtx
                                          * be in the array, but that entry is
                                          * required. The last entry applies to
                                          * all subsequent glyphs. */
-  SHORT         leadingBearingX[VAR];   /* Here the advance is assumed
+  FWORD         leadingBearingX[VAR];   /* Here the advance is assumed
                                          * to be the same as the advance
                                          * for the last entry above. The
                                          * number of entries in this array is
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
index f087b2317cb..f6d966cc97d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
@@ -34,6 +34,14 @@
 #include "hb-set-private.hh"
 
 
+#ifndef HB_MAX_NESTING_LEVEL
+#define HB_MAX_NESTING_LEVEL    6
+#endif
+#ifndef HB_MAX_CONTEXT_LENGTH
+#define HB_MAX_CONTEXT_LENGTH   64
+#endif
+
+
 namespace OT {
 
 
@@ -44,8 +52,6 @@ namespace OT {
 
 
 #define NOT_COVERED             ((unsigned int) -1)
-#define MAX_NESTING_LEVEL       6
-#define MAX_CONTEXT_LENGTH      64
 
 
 
@@ -539,6 +545,9 @@ struct Feature
           c->try_set (&featureParams, new_offset) &&
           !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
         return_trace (false);
+
+      if (c->edit_count > 1)
+        c->edit_count--; /* This was a "legitimate" edit; don't contribute to error count. */
     }
 
     return_trace (true);
@@ -573,6 +582,11 @@ struct LookupFlag : USHORT
   DEFINE_SIZE_STATIC (2);
 };
 
+} /* namespace OT */
+/* This has to be outside the namespace. */
+HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
+namespace OT {
+
 struct Lookup
 {
   inline unsigned int get_subtable_count (void) const { return subTable.len; }
@@ -756,7 +770,11 @@ struct CoverageFormat2
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
 
-    if (unlikely (!num_glyphs)) return_trace (true);
+    if (unlikely (!num_glyphs))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
 
     unsigned int num_ranges = 1;
     for (unsigned int i = 1; i < num_glyphs; i++)
@@ -1156,6 +1174,21 @@ struct Device
   inline hb_position_t get_y_delta (hb_font_t *font) const
   { return get_delta (font->y_ppem, font->y_scale); }
 
+  inline unsigned int get_size (void) const
+  {
+    unsigned int f = deltaFormat;
+    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
+    return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
+  }
+
+  private:
+
   inline int get_delta (unsigned int ppem, int scale) const
   {
     if (!ppem) return 0;
@@ -1166,8 +1199,6 @@ struct Device
 
     return (int) (pixels * (int64_t) scale / ppem);
   }
-
-
   inline int get_delta_pixels (unsigned int ppem_size) const
   {
     unsigned int f = deltaFormat;
@@ -1191,19 +1222,6 @@ struct Device
     return delta;
   }
 
-  inline unsigned int get_size (void) const
-  {
-    unsigned int f = deltaFormat;
-    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
-    return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
-  }
-
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
-  }
-
   protected:
   USHORT        startSize;              /* Smallest size to correct--in ppem */
   USHORT        endSize;                /* Largest size to correct--in ppem */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
index 9c5206c5594..b77ce74062d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
@@ -409,7 +409,7 @@ struct GDEF
 
 
   protected:
-  FixedVersion  version;                /* Version of the GDEF table--currently
+  FixedVersion<>version;                /* Version of the GDEF table--currently
                                          * 0x00010002u */
   OffsetTo
                 glyphClassDef;          /* Offset to class definition table
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
index 41e02200696..c065e179a23 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
@@ -36,8 +36,17 @@ namespace OT {
 
 
 /* buffer **position** var allocations */
-#define attach_lookback() var.u16[0] /* number of glyphs to go back to attach this glyph to its base */
-#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */
+#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
+#define attach_type() var.u8[2] /* attachment type */
+/* Note! if attach_chain() is zero, the value of attach_type() is irrelevant. */
+
+enum attach_type_t {
+  ATTACH_TYPE_NONE      = 0X00,
+
+  /* Each attachment should be either a mark or a cursive; can't be both. */
+  ATTACH_TYPE_MARK      = 0X01,
+  ATTACH_TYPE_CURSIVE   = 0X02,
+};
 
 
 /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
@@ -425,7 +434,9 @@ struct MarkArray : ArrayOf  /* Array of MarkRecords--in Coverage ord
     hb_glyph_position_t &o = buffer->cur_pos();
     o.x_offset = base_x - mark_x;
     o.y_offset = base_y - mark_y;
-    o.attach_lookback() = buffer->idx - glyph_pos;
+    o.attach_type() = ATTACH_TYPE_MARK;
+    o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
+    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
 
     buffer->idx++;
     return_trace (true);
@@ -741,7 +752,7 @@ struct PairPosFormat2
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    /* (this+coverage).add_coverage (c->input); // Don't need this. */
+    (this+coverage).add_coverage (c->input);
 
     unsigned int count1 = class1Count;
     const ClassDef &klass1 = this+classDef1;
@@ -906,9 +917,6 @@ struct CursivePosFormat1
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
 
-    /* We don't handle mark glyphs here. */
-    if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return_trace (false);
-
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return_trace (false);
 
@@ -992,7 +1000,9 @@ struct CursivePosFormat1
      */
     reverse_cursive_minor_offset (pos, child, c->direction, parent);
 
-    pos[child].cursive_chain() = parent - child;
+    pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
+    pos[child].attach_chain() = (int) parent - (int) child;
+    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
     if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction)))
       pos[child].y_offset = y_offset;
     else
@@ -1067,7 +1077,7 @@ struct MarkBasePosFormat1
     unsigned int mark_index = (this+markCoverage).get_coverage  (buffer->cur().codepoint);
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
-    /* now we search backwards for a non-mark glyph */
+    /* Now we search backwards for a non-mark glyph */
     hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
@@ -1079,7 +1089,7 @@ struct MarkBasePosFormat1
     } while (1);
 
     /* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */
-    if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+    //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
 
     unsigned int base_index = (this+baseCoverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint);
     if (base_index == NOT_COVERED) return_trace (false);
@@ -1168,14 +1178,14 @@ struct MarkLigPosFormat1
     unsigned int mark_index = (this+markCoverage).get_coverage  (buffer->cur().codepoint);
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
-    /* now we search backwards for a non-mark glyph */
+    /* Now we search backwards for a non-mark glyph */
     hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     if (!skippy_iter.prev ()) return_trace (false);
 
     /* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
-    if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+    //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); }
 
     unsigned int j = skippy_iter.idx;
     unsigned int lig_index = (this+ligatureCoverage).get_coverage  (buffer->info[j].codepoint);
@@ -1499,7 +1509,8 @@ struct GPOS : GSUBGPOS
   { return CastR (GSUBGPOS::get_lookup (i)); }
 
   static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
-  static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer);
+  static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
+  static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -1516,13 +1527,13 @@ struct GPOS : GSUBGPOS
 static void
 reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
 {
-  unsigned int j = pos[i].cursive_chain();
-  if (likely (!j))
+  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+  if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
     return;
 
-  j += i;
+  pos[i].attach_chain() = 0;
 
-  pos[i].cursive_chain() = 0;
+  unsigned int j = (int) i + chain;
 
   /* Stop if we see new parent in the chain. */
   if (j == new_parent)
@@ -1535,62 +1546,68 @@ reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direc
   else
     pos[j].x_offset = -pos[i].x_offset;
 
-  pos[j].cursive_chain() = i - j;
+  pos[j].attach_chain() = -chain;
+  pos[j].attach_type() = type;
 }
 static void
-fix_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
+propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
 {
-  unsigned int j = pos[i].cursive_chain();
-  if (likely (!j))
+  /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
+   * offset of glyph they are attached to. */
+  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+  if (likely (!chain))
     return;
 
-  j += i;
+  unsigned int j = (int) i + chain;
 
-  pos[i].cursive_chain() = 0;
+  pos[i].attach_chain() = 0;
 
-  fix_cursive_minor_offset (pos, j, direction);
+  propagate_attachment_offsets (pos, j, direction);
 
-  if (HB_DIRECTION_IS_HORIZONTAL (direction))
-    pos[i].y_offset += pos[j].y_offset;
-  else
+  assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE));
+
+  if (type & ATTACH_TYPE_CURSIVE)
+  {
+    if (HB_DIRECTION_IS_HORIZONTAL (direction))
+      pos[i].y_offset += pos[j].y_offset;
+    else
+      pos[i].x_offset += pos[j].x_offset;
+  }
+  else /*if (type & ATTACH_TYPE_MARK)*/
+  {
     pos[i].x_offset += pos[j].x_offset;
-}
+    pos[i].y_offset += pos[j].y_offset;
 
-static void
-fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
-{
-  if (likely (!(pos[i].attach_lookback())))
-    return;
-
-  unsigned int j = i - pos[i].attach_lookback();
-
-  pos[i].x_offset += pos[j].x_offset;
-  pos[i].y_offset += pos[j].y_offset;
-
-  if (HB_DIRECTION_IS_FORWARD (direction))
-    for (unsigned int k = j; k < i; k++) {
-      pos[i].x_offset -= pos[k].x_advance;
-      pos[i].y_offset -= pos[k].y_advance;
-    }
-  else
-    for (unsigned int k = j + 1; k < i + 1; k++) {
-      pos[i].x_offset += pos[k].x_advance;
-      pos[i].y_offset += pos[k].y_advance;
-    }
+    assert (j < i);
+    if (HB_DIRECTION_IS_FORWARD (direction))
+      for (unsigned int k = j; k < i; k++) {
+        pos[i].x_offset -= pos[k].x_advance;
+        pos[i].y_offset -= pos[k].y_advance;
+      }
+    else
+      for (unsigned int k = j + 1; k < i + 1; k++) {
+        pos[i].x_offset += pos[k].x_advance;
+        pos[i].y_offset += pos[k].y_advance;
+      }
+  }
 }
 
 void
 GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
 {
-  buffer->clear_positions ();
-
   unsigned int count = buffer->len;
   for (unsigned int i = 0; i < count; i++)
-    buffer->pos[i].attach_lookback() = buffer->pos[i].cursive_chain() = 0;
+    buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
 }
 
 void
-GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+{
+  //_hb_buffer_assert_gsubgpos_vars (buffer);
+}
+
+void
+GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
 {
   _hb_buffer_assert_gsubgpos_vars (buffer);
 
@@ -1598,13 +1615,10 @@ GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
   hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len);
   hb_direction_t direction = buffer->props.direction;
 
-  /* Handle cursive connections */
-  for (unsigned int i = 0; i < len; i++)
-    fix_cursive_minor_offset (pos, i, direction);
-
   /* Handle attachments */
-  for (unsigned int i = 0; i < len; i++)
-    fix_mark_attachment (pos, i, direction);
+  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
+    for (unsigned int i = 0; i < len; i++)
+      propagate_attachment_offsets (pos, i, direction);
 }
 
 
@@ -1633,8 +1647,8 @@ template 
 }
 
 
-#undef attach_lookback
-#undef cursive_chain
+#undef attach_chain
+#undef attach_type
 
 
 } /* namespace OT */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
index f544bd8b250..44dcd120e3b 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
@@ -265,16 +265,6 @@ struct Sequence
     TRACE_APPLY (this);
     unsigned int count = substitute.len;
 
-    /* TODO:
-     * Testing shows that Uniscribe actually allows zero-len susbstitute,
-     * which essentially deletes a glyph.  We don't allow for now.  It
-     * can be confusing to the client since the cluster from the deleted
-     * glyph won't be merged with any output cluster...  Also, currently
-     * buffer->move_to() makes assumptions about this too.  Perhaps fix
-     * in the future after figuring out what to do with the clusters.
-     */
-    if (unlikely (!count)) return_trace (false);
-
     /* Special-case to make it in-place and not consider this
      * as a "multiplied" substitution. */
     if (unlikely (count == 1))
@@ -282,6 +272,13 @@ struct Sequence
       c->replace_glyph (substitute.array[0]);
       return_trace (true);
     }
+    /* Spec disallows this, but Uniscribe allows it.
+     * https://github.com/behdad/harfbuzz/issues/253 */
+    else if (unlikely (count == 0))
+    {
+      c->buffer->delete_glyph ();
+      return_trace (true);
+    }
 
     unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
                          HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
@@ -630,7 +627,7 @@ struct Ligature
     unsigned int total_component_count = 0;
 
     unsigned int match_length = 0;
-    unsigned int match_positions[MAX_CONTEXT_LENGTH];
+    unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
 
     if (likely (!match_input (c, count,
                               &component[1],
@@ -970,7 +967,7 @@ struct ReverseChainSingleSubstFormat1
   inline bool apply (hb_apply_context_t *c) const
   {
     TRACE_APPLY (this);
-    if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
+    if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
       return_trace (false); /* No chaining to this type */
 
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1268,7 +1265,6 @@ struct GSUB : GSUBGPOS
   { return CastR (GSUBGPOS::get_lookup (i)); }
 
   static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
-  static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -1289,19 +1285,32 @@ GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
 
   const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
   unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
   {
-    _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
-    _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+    unsigned int props = gdef.get_glyph_props (info[i].codepoint);
+    if (!props)
+    {
+      /* Never mark default-ignorables as marks.
+       * They won't get in the way of lookups anyway,
+       * but having them as mark will cause them to be skipped
+       * over if the lookup-flag says so, but at least for the
+       * Mongolian variation selectors, looks like Uniscribe
+       * marks them as non-mark.  Some Mongolian fonts without
+       * GDEF rely on this.  Another notable character that
+       * this applies to is COMBINING GRAPHEME JOINER. */
+      props = (_hb_glyph_info_get_general_category (&info[i]) !=
+               HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
+               _hb_glyph_info_is_default_ignorable (&info[i])) ?
+              HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
+              HB_OT_LAYOUT_GLYPH_PROPS_MARK;
+    }
+    _hb_glyph_info_set_glyph_props (&info[i], props);
+    _hb_glyph_info_clear_lig_props (&info[i]);
     buffer->info[i].syllable() = 0;
   }
 }
 
-void
-GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
-{
-}
-
 
 /* Out-of-class implementation for methods recursing */
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
index 0bcbaed81ca..73cfb77fe2a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
@@ -74,7 +74,7 @@ struct hb_closure_context_t :
 
   hb_closure_context_t (hb_face_t *face_,
                         hb_set_t *glyphs_,
-                        unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+                        unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                           face (face_),
                           glyphs (glyphs_),
                           recurse_func (NULL),
@@ -196,7 +196,7 @@ struct hb_collect_glyphs_context_t :
                                hb_set_t  *glyphs_input,  /* OUT. May be NULL */
                                hb_set_t  *glyphs_after,  /* OUT. May be NULL */
                                hb_set_t  *glyphs_output, /* OUT. May be NULL */
-                               unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+                               unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                               face (face_),
                               before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
                               input  (glyphs_input  ? glyphs_input  : hb_set_get_empty ()),
@@ -319,7 +319,7 @@ struct hb_apply_context_t :
       if (!c->check_glyph_property (&info, lookup_props))
         return SKIP_YES;
 
-      if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+      if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
                     (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
                     (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
         return SKIP_MAYBE;
@@ -355,11 +355,11 @@ struct hb_apply_context_t :
     {
       matcher.set_lookup_props (lookup_props);
     }
-    inline void set_match_func (matcher_t::match_func_t match_func,
-                                const void *match_data,
+    inline void set_match_func (matcher_t::match_func_t match_func_,
+                                const void *match_data_,
                                 const USHORT glyph_data[])
     {
-      matcher.set_match_func (match_func, match_data);
+      matcher.set_match_func (match_func_, match_data_);
       match_glyph_data = glyph_data;
     }
 
@@ -483,7 +483,7 @@ struct hb_apply_context_t :
                         lookup_mask (1),
                         auto_zwj (true),
                         recurse_func (NULL),
-                        nesting_level_left (MAX_NESTING_LEVEL),
+                        nesting_level_left (HB_MAX_NESTING_LEVEL),
                         lookup_props (0),
                         gdef (*hb_ot_layout_from_face (face)->gdef),
                         has_glyph_classes (gdef.has_glyph_classes ()),
@@ -704,13 +704,13 @@ static inline bool match_input (hb_apply_context_t *c,
                                 match_func_t match_func,
                                 const void *match_data,
                                 unsigned int *end_offset,
-                                unsigned int match_positions[MAX_CONTEXT_LENGTH],
+                                unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
                                 bool *p_is_mark_ligature = NULL,
                                 unsigned int *p_total_component_count = NULL)
 {
   TRACE_APPLY (NULL);
 
-  if (unlikely (count > MAX_CONTEXT_LENGTH)) return_trace (false);
+  if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
 
   hb_buffer_t *buffer = c->buffer;
 
@@ -784,7 +784,7 @@ static inline bool match_input (hb_apply_context_t *c,
 }
 static inline bool ligate_input (hb_apply_context_t *c,
                                  unsigned int count, /* Including the first glyph */
-                                 unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                  unsigned int match_length,
                                  hb_codepoint_t lig_glyph,
                                  bool is_mark_ligature,
@@ -836,19 +836,21 @@ static inline bool ligate_input (hb_apply_context_t *c,
     if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
     {
       _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
-      _hb_glyph_info_set_modified_combining_class (&buffer->cur(), 0);
     }
   }
   c->replace_glyph_with_ligature (lig_glyph, klass);
 
   for (unsigned int i = 1; i < count; i++)
   {
-    while (buffer->idx < match_positions[i])
+    while (buffer->idx < match_positions[i] && !buffer->in_error)
     {
       if (!is_mark_ligature) {
+        unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+        if (this_comp == 0)
+          this_comp = last_num_components;
         unsigned int new_lig_comp = components_so_far - last_num_components +
-                                    MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->cur()), 1u), last_num_components);
-        _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
+                                    MIN (this_comp, last_num_components);
+          _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
       }
       buffer->next_glyph ();
     }
@@ -865,8 +867,11 @@ static inline bool ligate_input (hb_apply_context_t *c,
     /* Re-adjust components for any marks following. */
     for (unsigned int i = buffer->idx; i < buffer->len; i++) {
       if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
+        unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+        if (!this_comp)
+          break;
         unsigned int new_lig_comp = components_so_far - last_num_components +
-                                    MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->info[i]), 1u), last_num_components);
+                                    MIN (this_comp, last_num_components);
         _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
       } else
         break;
@@ -944,7 +949,7 @@ static inline void recurse_lookups (context_t *c,
 
 static inline bool apply_lookup (hb_apply_context_t *c,
                                  unsigned int count, /* Including the first glyph */
-                                 unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                  unsigned int lookupCount,
                                  const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
                                  unsigned int match_length)
@@ -966,12 +971,17 @@ static inline bool apply_lookup (hb_apply_context_t *c,
       match_positions[j] += delta;
   }
 
-  for (unsigned int i = 0; i < lookupCount; i++)
+  for (unsigned int i = 0; i < lookupCount && !buffer->in_error; i++)
   {
     unsigned int idx = lookupRecord[i].sequenceIndex;
     if (idx >= count)
       continue;
 
+    /* Don't recurse to ourself at same position.
+     * Note that this test is too naive, it doesn't catch longer loops. */
+    if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+      continue;
+
     buffer->move_to (match_positions[idx]);
 
     unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
@@ -986,16 +996,19 @@ static inline bool apply_lookup (hb_apply_context_t *c,
 
     /* Recursed lookup changed buffer len.  Adjust. */
 
-    /* end can't go back past the current match position.
-     * Note: this is only true because we do NOT allow MultipleSubst
-     * with zero sequence len. */
-    end = MAX ((int) match_positions[idx] + 1, int (end) + delta);
+    end = int (end) + delta;
+    if (end <= match_positions[idx])
+    {
+      /* There can't be any further changes. */
+      assert (end == match_positions[idx]);
+      break;
+    }
 
     unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
 
     if (delta > 0)
     {
-      if (unlikely (delta + count > MAX_CONTEXT_LENGTH))
+      if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
         break;
     }
     else
@@ -1094,7 +1107,7 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
                                          ContextApplyLookupContext &lookup_context)
 {
   unsigned int match_length = 0;
-  unsigned int match_positions[MAX_CONTEXT_LENGTH];
+  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
   return match_input (c,
                       inputCount, input,
                       lookup_context.funcs.match, lookup_context.match_data,
@@ -1621,7 +1634,7 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
                                                ChainContextApplyLookupContext &lookup_context)
 {
   unsigned int match_length = 0;
-  unsigned int match_positions[MAX_CONTEXT_LENGTH];
+  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
   return match_input (c,
                       inputCount, input,
                       lookup_context.funcs.match, lookup_context.match_data[1],
@@ -2267,7 +2280,7 @@ struct GSUBGPOS
   }
 
   protected:
-  FixedVersion  version;        /* Version of the GSUB/GPOS table--initially set
+  FixedVersion<>version;        /* Version of the GSUB/GPOS table--initially set
                                  * to 0x00010000u */
   OffsetTo
                 scriptList;     /* ScriptList table */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
index 57eb7535091..be61722eb03 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
@@ -218,7 +218,7 @@ struct JSTF
   }
 
   protected:
-  FixedVersion  version;        /* Version of the JSTF table--initially set
+  FixedVersion<>version;        /* Version of the JSTF table--initially set
                                  * to 0x00010000u */
   RecordArrayOf
                 scriptList;     /* Array of JstfScripts--listed
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
index d7e97791003..2081949fe62 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
@@ -49,7 +49,7 @@ hb_ot_layout_table_find_feature (hb_face_t    *face,
  * GDEF
  */
 
-typedef enum
+enum hb_ot_layout_glyph_props_flags_t
 {
   /* The following three match LookupFlags::Ignore* numbers. */
   HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH   = 0x02u,
@@ -64,7 +64,8 @@ typedef enum
   HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE     = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
                                           HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
                                           HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
-} hb_ot_layout_glyph_class_mask_t;
+};
+HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
 
 
 /*
@@ -98,21 +99,20 @@ hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
                                 const hb_ot_layout_lookup_accelerator_t &accel);
 
 
-/* Should be called after all the substitute_lookup's are done */
-HB_INTERNAL void
-hb_ot_layout_substitute_finish (hb_font_t    *font,
-                                hb_buffer_t  *buffer);
-
-
-/* Should be called before all the position_lookup's are done.  Resets positions to zero. */
+/* Should be called before all the position_lookup's are done. */
 HB_INTERNAL void
 hb_ot_layout_position_start (hb_font_t    *font,
                              hb_buffer_t  *buffer);
 
-/* Should be called after all the position_lookup's are done */
+/* Should be called after all the position_lookup's are done, to finish advances. */
 HB_INTERNAL void
-hb_ot_layout_position_finish (hb_font_t    *font,
-                              hb_buffer_t  *buffer);
+hb_ot_layout_position_finish_advances (hb_font_t    *font,
+                                       hb_buffer_t  *buffer);
+
+/* Should be called after hb_ot_layout_position_finish_advances, to finish offsets. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_offsets (hb_font_t    *font,
+                                      hb_buffer_t  *buffer);
 
 
 
@@ -180,8 +180,7 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout);
  */
 
 /* buffer var allocations, used during the entire shaping process */
-#define unicode_props0()        var2.u8[0]
-#define unicode_props1()        var2.u8[1]
+#define unicode_props()         var2.u16[0]
 
 /* buffer var allocations, used during the GSUB/GPOS processing */
 #define glyph_props()           var1.u16[0] /* GDEF glyph properties */
@@ -214,48 +213,146 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
 
 /* unicode_props */
 
-enum {
-  MASK0_ZWJ       = 0x20u,
-  MASK0_ZWNJ      = 0x40u,
-  MASK0_IGNORABLE = 0x80u,
-  MASK0_GEN_CAT   = 0x1Fu
+/* Design:
+ * unicode_props() is a two-byte number.  The low byte includes:
+ * - General_Category: 5 bits.
+ * - A bit each for:
+ *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
+ *   * Whether it's one of the three Mongolian Free Variation Selectors.
+ *   * One free bit right now.
+ *
+ * The high-byte has different meanings, switched by the Gen-Cat:
+ * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
+ * - For Ws: index of which space character this is, if space fallback
+ *   is needed, ie. we don't set this by default, only if asked to.
+ */
+
+enum hb_unicode_props_flags_t {
+  UPROPS_MASK_GEN_CAT   = 0x001Fu,
+  UPROPS_MASK_IGNORABLE = 0x0020u,
+  UPROPS_MASK_FVS       = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+
+  /* If GEN_CAT=FORMAT, top byte masks: */
+  UPROPS_MASK_Cf_ZWJ    = 0x0100u,
+  UPROPS_MASK_Cf_ZWNJ   = 0x0200u
 };
+HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
 
 static inline void
-_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
+_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
 {
-  /* XXX This shouldn't be inlined, or at least not while is_default_ignorable() is inline. */
-  info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) |
-                           (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) |
-                           (info->codepoint == 0x200Cu ? MASK0_ZWNJ : 0) |
-                           (info->codepoint == 0x200Du ? MASK0_ZWJ : 0);
-  info->unicode_props1() = unicode->modified_combining_class (info->codepoint);
+  hb_unicode_funcs_t *unicode = buffer->unicode;
+  unsigned int u = info->codepoint;
+  unsigned int gen_cat = (unsigned int) unicode->general_category (u);
+  unsigned int props = gen_cat;
+
+  if (u >= 0x80)
+  {
+    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
+    if (unlikely (unicode->is_default_ignorable (u)))
+    {
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
+      props |=  UPROPS_MASK_IGNORABLE;
+      if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+      if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+      /* Mongolian Free Variation Selectors need to be remembered
+       * because although we need to hide them like default-ignorables,
+       * they need to non-ignorable during shaping.  This is similar to
+       * what we do for joiners in Indic-like shapers, but since the
+       * FVSes are GC=Mn, we have use a separate bit to remember them.
+       * Fixes:
+       * https://github.com/behdad/harfbuzz/issues/234
+       */
+      if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
+    }
+    else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
+    {
+      /* The above check is just an optimization to let in only things we need further
+       * processing on. */
+
+      /* Only Mn and Mc can have non-zero ccc:
+       * http://www.unicode.org/policies/stability_policy.html#Property_Value
+       * """
+       * Canonical_Combining_Class, General_Category
+       * All characters other than those with General_Category property values
+       * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class
+       * property value 0.
+       * 1.1.5+
+       * """
+       *
+       * Also, all Mn's that are Default_Ignorable, have ccc=0, hence
+       * the "else if".
+       */
+      props |= unicode->modified_combining_class (info->codepoint)<<8;
+
+      /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
+       * behave correctly in non-native directionality.  They originally
+       * are MODIFIER_SYMBOL.  Fixes:
+       * https://github.com/behdad/harfbuzz/issues/169
+       */
+      if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
+      {
+        props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+      }
+    }
+  }
+
+  info->unicode_props() = props;
 }
 
 static inline void
 _hb_glyph_info_set_general_category (hb_glyph_info_t *info,
                                      hb_unicode_general_category_t gen_cat)
 {
-  info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT);
+  /* Clears top-byte. */
+  info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
 }
 
 static inline hb_unicode_general_category_t
 _hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
 {
-  return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT);
+  return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
 }
 
+static inline bool
+_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
+{
+  return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
 static inline void
 _hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
                                              unsigned int modified_class)
 {
-  info->unicode_props1() = modified_class;
+  if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
+    return;
+  info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
 }
-
 static inline unsigned int
 _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
 {
-  return info->unicode_props1();
+  return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+         HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+}
+static inline void
+_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
+{
+  if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
+    return;
+  info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
+}
+static inline hb_unicode_funcs_t::space_t
+_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_space (info) ?
+         (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
+         hb_unicode_funcs_t::NOT_SPACE;
 }
 
 static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
@@ -263,25 +360,44 @@ static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
 static inline hb_bool_t
 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
 {
-  return (info->unicode_props0() & MASK0_IGNORABLE) && !_hb_glyph_info_ligated (info);
+  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+         !_hb_glyph_info_ligated (info);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+{
+  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+          == UPROPS_MASK_IGNORABLE) &&
+         !_hb_glyph_info_ligated (info);
 }
 
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+         HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
 static inline hb_bool_t
 _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props0() & MASK0_ZWNJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
 }
-
 static inline hb_bool_t
 _hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props0() & MASK0_ZWJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
 }
-
 static inline void
 _hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
 {
-  info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ;
+  if (!_hb_glyph_info_is_unicode_format (info))
+    return;
+  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
 }
 
 /* lig_props: aka lig_id / lig_comp
@@ -442,11 +558,9 @@ _hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
 }
 
 static inline void
-_hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *info)
+_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
 {
-  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
-                           HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
-                           HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
 }
 
 
@@ -455,22 +569,19 @@ _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *in
 static inline void
 _hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
 {
-  HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props0);
-  HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props1);
+  HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
 }
 
 static inline void
 _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
 {
-  HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props0);
-  HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props1);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
 }
 
 static inline void
 _hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
 {
-  HB_BUFFER_ASSERT_VAR (buffer, unicode_props0);
-  HB_BUFFER_ASSERT_VAR (buffer, unicode_props1);
+  HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
 }
 
 static inline void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
index 7dac059f595..74f61136780 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
@@ -60,6 +60,80 @@ _hb_ot_layout_create (hb_face_t *face)
   layout->gpos_blob = OT::Sanitizer::sanitize (face->reference_table (HB_OT_TAG_GPOS));
   layout->gpos = OT::Sanitizer::lock_instance (layout->gpos_blob);
 
+  {
+    /*
+     * The ugly business of blacklisting individual fonts' tables happen here!
+     * See this thread for why we finally had to bend in and do this:
+     * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+     */
+    unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob);
+    unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
+    unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
+    if (0
+      /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+      || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+      || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+      || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+      || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+      || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+      /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+      || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
+    )
+    {
+      /* In certain versions of Times New Roman Italic and Bold Italic,
+       * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
+       * glyph class 3 (mark) in GDEF.  Nuke the GDEF to avoid zero-width
+       * double-quote.  See:
+       * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+       */
+     if (3 == layout->gdef->get_glyph_class (5))
+       layout->gdef = &OT::Null(OT::GDEF);
+    }
+    else if (0
+      /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c  tahoma.ttf from Windows 8 */
+      || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
+      /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc  tahomabd.ttf from Windows 8 */
+      || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
+      /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e  tahoma.ttf from Windows 8.1 */
+      || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
+      /* sha1sum:6d400781948517c3c0441ba42acb309584b73033  tahomabd.ttf from Windows 8.1 */
+      || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
+      /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846  tahoma.ttf from Windows 10 */
+      || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
+      /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343  tahomabd.ttf from Windows 10 */
+      || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
+      /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7  Tahoma.ttf from Mac OS X 10.9 */
+      || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
+      /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba  Tahoma Bold.ttf from Mac OS X 10.9 */
+      || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
+      /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0  himalaya.ttf from Windows 8 */
+      || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
+      /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427  himalaya.ttf from Windows 8.1 */
+      || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
+      /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44  cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+      /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371  cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+      || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
+      /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f  cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+      /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b  cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+      || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
+    )
+    {
+      /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
+       * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
+       * and the version of Cantarell shipped by Ubuntu 16.04.
+       * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
+       * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+       *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+       *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+       */
+      layout->gdef = &OT::Null(OT::GDEF);
+    }
+  }
+
   layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
   layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
 
@@ -130,6 +204,8 @@ hb_ot_layout_has_glyph_classes (hb_face_t *face)
 }
 
 /**
+ * hb_ot_layout_get_glyph_class:
+ *
  * Since: 0.9.7
  **/
 hb_ot_layout_glyph_class_t
@@ -140,6 +216,8 @@ hb_ot_layout_get_glyph_class (hb_face_t      *face,
 }
 
 /**
+ * hb_ot_layout_get_glyphs_in_class:
+ *
  * Since: 0.9.7
  **/
 void
@@ -365,6 +443,8 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
 }
 
 /**
+ * hb_ot_layout_language_get_required_feature:
+ *
  * Since: 0.9.30
  **/
 hb_bool_t
@@ -452,6 +532,8 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
 }
 
 /**
+ * hb_ot_layout_feature_get_lookups:
+ *
  * Since: 0.9.7
  **/
 unsigned int
@@ -469,6 +551,8 @@ hb_ot_layout_feature_get_lookups (hb_face_t    *face,
 }
 
 /**
+ * hb_ot_layout_table_get_lookup_count:
+ *
  * Since: 0.9.22
  **/
 unsigned int
@@ -629,6 +713,8 @@ _hb_ot_layout_collect_lookups_languages (hb_face_t      *face,
 }
 
 /**
+ * hb_ot_layout_collect_lookups:
+ *
  * Since: 0.9.8
  **/
 void
@@ -673,6 +759,8 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
 }
 
 /**
+ * hb_ot_layout_lookup_collect_glyphs:
+ *
  * Since: 0.9.7
  **/
 void
@@ -721,6 +809,8 @@ hb_ot_layout_has_substitution (hb_face_t *face)
 }
 
 /**
+ * hb_ot_layout_lookup_would_substitute:
+ *
  * Since: 0.9.7
  **/
 hb_bool_t
@@ -742,7 +832,7 @@ hb_ot_layout_lookup_would_substitute_fast (hb_face_t            *face,
                                            hb_bool_t             zero_context)
 {
   if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
-  OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context);
+  OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
 
   const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
 
@@ -755,13 +845,9 @@ hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer)
   OT::GSUB::substitute_start (font, buffer);
 }
 
-void
-hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer)
-{
-  OT::GSUB::substitute_finish (font, buffer);
-}
-
 /**
+ * hb_ot_layout_lookup_substitute_closure:
+ *
  * Since: 0.9.7
  **/
 void
@@ -793,12 +879,20 @@ hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer)
 }
 
 void
-hb_ot_layout_position_finish (hb_font_t *font, hb_buffer_t *buffer)
+hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer)
 {
-  OT::GPOS::position_finish (font, buffer);
+  OT::GPOS::position_finish_advances (font, buffer);
+}
+
+void
+hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
+{
+  OT::GPOS::position_finish_offsets (font, buffer);
 }
 
 /**
+ * hb_ot_layout_get_size_params:
+ *
  * Since: 0.9.10
  **/
 hb_bool_t
@@ -882,20 +976,79 @@ struct GPOSProxy
 };
 
 
-template 
+struct hb_get_subtables_context_t :
+       OT::hb_dispatch_context_t
+{
+  template 
+  static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c)
+  {
+    const Type *typed_obj = (const Type *) obj;
+    return typed_obj->apply (c);
+  }
+
+  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
+
+  struct hb_applicable_t
+  {
+    inline void init (const void *obj_, hb_apply_func_t apply_func_)
+    {
+      obj = obj_;
+      apply_func = apply_func_;
+    }
+
+    inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
+
+    private:
+    const void *obj;
+    hb_apply_func_t apply_func;
+  };
+
+  typedef hb_auto_array_t array_t;
+
+  /* Dispatch interface. */
+  inline const char *get_name (void) { return "GET_SUBTABLES"; }
+  template 
+  inline return_t dispatch (const T &obj)
+  {
+    hb_applicable_t *entry = array.push();
+    if (likely (entry))
+      entry->init (&obj, apply_to);
+    return HB_VOID;
+  }
+  static return_t default_return_value (void) { return HB_VOID; }
+  bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
+
+  hb_get_subtables_context_t (array_t &array_) :
+                              array (array_),
+                              debug_depth (0) {}
+
+  array_t &array;
+  unsigned int debug_depth;
+};
+
 static inline bool
 apply_forward (OT::hb_apply_context_t *c,
-               const Obj &obj,
-               const hb_ot_layout_lookup_accelerator_t &accel)
+               const hb_ot_layout_lookup_accelerator_t &accel,
+               const hb_get_subtables_context_t::array_t &subtables)
 {
   bool ret = false;
   hb_buffer_t *buffer = c->buffer;
-  while (buffer->idx < buffer->len)
+  while (buffer->idx < buffer->len && !buffer->in_error)
   {
+    bool applied = false;
     if (accel.may_have (buffer->cur().codepoint) &&
         (buffer->cur().mask & c->lookup_mask) &&
-        c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
-        obj.apply (c))
+        c->check_glyph_property (&buffer->cur(), c->lookup_props))
+     {
+       for (unsigned int i = 0; i < subtables.len; i++)
+         if (subtables[i].apply (c))
+         {
+           applied = true;
+           break;
+         }
+     }
+
+    if (applied)
       ret = true;
     else
       buffer->next_glyph ();
@@ -903,11 +1056,10 @@ apply_forward (OT::hb_apply_context_t *c,
   return ret;
 }
 
-template 
 static inline bool
 apply_backward (OT::hb_apply_context_t *c,
-                const Obj &obj,
-                const hb_ot_layout_lookup_accelerator_t &accel)
+               const hb_ot_layout_lookup_accelerator_t &accel,
+               const hb_get_subtables_context_t::array_t &subtables)
 {
   bool ret = false;
   hb_buffer_t *buffer = c->buffer;
@@ -915,9 +1067,15 @@ apply_backward (OT::hb_apply_context_t *c,
   {
     if (accel.may_have (buffer->cur().codepoint) &&
         (buffer->cur().mask & c->lookup_mask) &&
-        c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
-        obj.apply (c))
-      ret = true;
+        c->check_glyph_property (&buffer->cur(), c->lookup_props))
+    {
+     for (unsigned int i = 0; i < subtables.len; i++)
+       if (subtables[i].apply (c))
+       {
+         ret = true;
+         break;
+       }
+    }
     /* The reverse lookup doesn't "advance" cursor (for good reason). */
     buffer->idx--;
 
@@ -926,26 +1084,6 @@ apply_backward (OT::hb_apply_context_t *c,
   return ret;
 }
 
-struct hb_apply_forward_context_t :
-       OT::hb_dispatch_context_t
-{
-  inline const char *get_name (void) { return "APPLY_FWD"; }
-  template 
-  inline return_t dispatch (const T &obj) { return apply_forward (c, obj, accel); }
-  static return_t default_return_value (void) { return false; }
-  bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return true; }
-
-  hb_apply_forward_context_t (OT::hb_apply_context_t *c_,
-                              const hb_ot_layout_lookup_accelerator_t &accel_) :
-                                c (c_),
-                                accel (accel_),
-                                debug_depth (0) {}
-
-  OT::hb_apply_context_t *c;
-  const hb_ot_layout_lookup_accelerator_t &accel;
-  unsigned int debug_depth;
-};
-
 template 
 static inline void
 apply_string (OT::hb_apply_context_t *c,
@@ -959,6 +1097,10 @@ apply_string (OT::hb_apply_context_t *c,
 
   c->set_lookup_props (lookup.get_props ());
 
+  hb_get_subtables_context_t::array_t subtables;
+  hb_get_subtables_context_t c_get_subtables (subtables);
+  lookup.dispatch (&c_get_subtables);
+
   if (likely (!lookup.is_reverse ()))
   {
     /* in/out forward substitution/positioning */
@@ -967,13 +1109,7 @@ apply_string (OT::hb_apply_context_t *c,
     buffer->idx = 0;
 
     bool ret;
-    if (lookup.get_subtable_count () == 1)
-    {
-      hb_apply_forward_context_t c_forward (c, accel);
-      ret = lookup.dispatch (&c_forward);
-    }
-    else
-      ret = apply_forward (c, lookup, accel);
+    ret = apply_forward (c, accel, subtables);
     if (ret)
     {
       if (!Proxy::inplace)
@@ -989,7 +1125,7 @@ apply_string (OT::hb_apply_context_t *c,
       buffer->remove_output ();
     buffer->idx = buffer->len - 1;
 
-    apply_backward (c, lookup, accel);
+    apply_backward (c, accel, subtables);
   }
 }
 
@@ -1008,25 +1144,15 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
     const stage_map_t *stage = &stages[table_index][stage_index];
     for (; i < stage->last_lookup; i++)
     {
-#if 0
-      char buf[4096];
-      hb_buffer_serialize_glyphs (buffer, 0, buffer->len,
-                                  buf, sizeof (buf), NULL,
-                                  font,
-                                  HB_BUFFER_SERIALIZE_FORMAT_TEXT,
-                                  Proxy::table_index == 0 ?
-                                  HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS :
-                                  HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
-      printf ("buf: [%s]\n", buf);
-#endif
-
       unsigned int lookup_index = lookups[table_index][i].index;
+      if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
       c.set_lookup_index (lookup_index);
       c.set_lookup_mask (lookups[table_index][i].mask);
       c.set_auto_zwj (lookups[table_index][i].auto_zwj);
       apply_string (&c,
                            proxy.table.get_lookup (lookup_index),
                            proxy.accels[lookup_index]);
+      (void) buffer->message (font, "end lookup %d", lookup_index);
     }
 
     if (stage->pause_func)
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
index 7364adaa77e..2c455a954cd 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
@@ -48,7 +48,7 @@ HB_BEGIN_DECLS
  * GDEF
  */
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_has_glyph_classes (hb_face_t *face);
 
 typedef enum {
@@ -59,11 +59,11 @@ typedef enum {
   HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT    = 4
 } hb_ot_layout_glyph_class_t;
 
-hb_ot_layout_glyph_class_t
+HB_EXTERN hb_ot_layout_glyph_class_t
 hb_ot_layout_get_glyph_class (hb_face_t      *face,
                               hb_codepoint_t  glyph);
 
-void
+HB_EXTERN void
 hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
                                   hb_ot_layout_glyph_class_t  klass,
                                   hb_set_t                   *glyphs /* OUT */);
@@ -71,7 +71,7 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
 
 /* Not that useful.  Provides list of attach points for a glyph that a
  * client may want to cache */
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_get_attach_points (hb_face_t      *face,
                                 hb_codepoint_t  glyph,
                                 unsigned int    start_offset,
@@ -79,7 +79,7 @@ hb_ot_layout_get_attach_points (hb_face_t      *face,
                                 unsigned int   *point_array /* OUT */);
 
 /* Ligature caret positions */
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_get_ligature_carets (hb_font_t      *font,
                                   hb_direction_t  direction,
                                   hb_codepoint_t  glyph,
@@ -96,35 +96,35 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
 #define HB_OT_LAYOUT_NO_FEATURE_INDEX           0xFFFFu
 #define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX     0xFFFFu
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_table_get_script_tags (hb_face_t    *face,
                                     hb_tag_t      table_tag,
                                     unsigned int  start_offset,
                                     unsigned int *script_count /* IN/OUT */,
                                     hb_tag_t     *script_tags /* OUT */);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_table_find_script (hb_face_t    *face,
                                 hb_tag_t      table_tag,
                                 hb_tag_t      script_tag,
                                 unsigned int *script_index);
 
 /* Like find_script, but takes zero-terminated array of scripts to test */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_table_choose_script (hb_face_t      *face,
                                   hb_tag_t        table_tag,
                                   const hb_tag_t *script_tags,
                                   unsigned int   *script_index,
                                   hb_tag_t       *chosen_script);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
                                      hb_tag_t      table_tag,
                                      unsigned int  start_offset,
                                      unsigned int *feature_count /* IN/OUT */,
                                      hb_tag_t     *feature_tags /* OUT */);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_script_get_language_tags (hb_face_t    *face,
                                        hb_tag_t      table_tag,
                                        unsigned int  script_index,
@@ -132,21 +132,21 @@ hb_ot_layout_script_get_language_tags (hb_face_t    *face,
                                        unsigned int *language_count /* IN/OUT */,
                                        hb_tag_t     *language_tags /* OUT */);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_script_find_language (hb_face_t    *face,
                                    hb_tag_t      table_tag,
                                    unsigned int  script_index,
                                    hb_tag_t      language_tag,
                                    unsigned int *language_index);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
                                                   hb_tag_t      table_tag,
                                                   unsigned int  script_index,
                                                   unsigned int  language_index,
                                                   unsigned int *feature_index);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_language_get_required_feature (hb_face_t    *face,
                                             hb_tag_t      table_tag,
                                             unsigned int  script_index,
@@ -154,7 +154,7 @@ hb_ot_layout_language_get_required_feature (hb_face_t    *face,
                                             unsigned int *feature_index,
                                             hb_tag_t     *feature_tag);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
                                            hb_tag_t      table_tag,
                                            unsigned int  script_index,
@@ -163,7 +163,7 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
                                            unsigned int *feature_count /* IN/OUT */,
                                            unsigned int *feature_indexes /* OUT */);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
                                         hb_tag_t      table_tag,
                                         unsigned int  script_index,
@@ -172,7 +172,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
                                         unsigned int *feature_count /* IN/OUT */,
                                         hb_tag_t     *feature_tags /* OUT */);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_language_find_feature (hb_face_t    *face,
                                     hb_tag_t      table_tag,
                                     unsigned int  script_index,
@@ -180,7 +180,7 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
                                     hb_tag_t      feature_tag,
                                     unsigned int *feature_index);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_feature_get_lookups (hb_face_t    *face,
                                   hb_tag_t      table_tag,
                                   unsigned int  feature_index,
@@ -188,12 +188,12 @@ hb_ot_layout_feature_get_lookups (hb_face_t    *face,
                                   unsigned int *lookup_count /* IN/OUT */,
                                   unsigned int *lookup_indexes /* OUT */);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
                                      hb_tag_t      table_tag);
 
 
-void
+HB_EXTERN void
 hb_ot_layout_collect_lookups (hb_face_t      *face,
                               hb_tag_t        table_tag,
                               const hb_tag_t *scripts,
@@ -201,7 +201,7 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
                               const hb_tag_t *features,
                               hb_set_t       *lookup_indexes /* OUT */);
 
-void
+HB_EXTERN void
 hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
                                     hb_tag_t      table_tag,
                                     unsigned int  lookup_index,
@@ -228,7 +228,7 @@ typedef hb_bool_t
                                        const hb_ot_layout_glyph_sequence_t *sequence,
                                        void         *user_data);
 
-void
+HB_EXTERN void
 Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t    *face,
                                          hb_tag_t      table_tag,
                                          unsigned int  lookup_index,
@@ -241,17 +241,17 @@ Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t    *face,
  * GSUB
  */
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_has_substitution (hb_face_t *face);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
                                       unsigned int          lookup_index,
                                       const hb_codepoint_t *glyphs,
                                       unsigned int          glyphs_length,
                                       hb_bool_t             zero_context);
 
-void
+HB_EXTERN void
 hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
                                         unsigned int  lookup_index,
                                         hb_set_t     *glyphs
@@ -259,7 +259,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
 
 #ifdef HB_NOT_IMPLEMENTED
 /* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
 Xhb_ot_layout_lookup_substitute (hb_font_t            *font,
                                 unsigned int          lookup_index,
                                 const hb_ot_layout_glyph_sequence_t *sequence,
@@ -274,12 +274,12 @@ Xhb_ot_layout_lookup_substitute (hb_font_t            *font,
  * GPOS
  */
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_has_positioning (hb_face_t *face);
 
 #ifdef HB_NOT_IMPLEMENTED
 /* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
 Xhb_ot_layout_lookup_position (hb_font_t            *font,
                               unsigned int          lookup_index,
                               const hb_ot_layout_glyph_sequence_t *sequence,
@@ -288,7 +288,7 @@ Xhb_ot_layout_lookup_position (hb_font_t            *font,
 
 /* Optical 'size' feature info.  Returns true if found.
  * http://www.microsoft.com/typography/otspec/features_pt.htm#size */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_ot_layout_get_size_params (hb_face_t    *face,
                               unsigned int *design_size,       /* OUT.  May be NULL */
                               unsigned int *subfamily_id,      /* OUT.  May be NULL */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
index 9d78a96bc68..6d9cf96331d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
@@ -159,23 +159,9 @@ enum hb_ot_map_feature_flags_t {
   F_MANUAL_ZWJ          = 0x0004u, /* Don't skip over ZWJ when matching. */
   F_GLOBAL_SEARCH       = 0x0008u  /* If feature not found in LangSys, look for it in global feature list and pick one. */
 };
+HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
 /* Macro version for where const is desired. */
 #define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigned int) (r)))
-static inline hb_ot_map_feature_flags_t
-operator | (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l | (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator & (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l & (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator ~ (hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t (~(unsigned int) r); }
-static inline hb_ot_map_feature_flags_t&
-operator |= (hb_ot_map_feature_flags_t &l, hb_ot_map_feature_flags_t r)
-{ l = l | r; return l; }
-static inline hb_ot_map_feature_flags_t&
-operator &= (hb_ot_map_feature_flags_t& l, hb_ot_map_feature_flags_t r)
-{ l = l & r; return l; }
 
 
 struct hb_ot_map_builder_t
@@ -217,7 +203,8 @@ struct hb_ot_map_builder_t
     unsigned int stage[2]; /* GSUB/GPOS */
 
     static int cmp (const feature_info_t *a, const feature_info_t *b)
-    { return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); }
+    { return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) :
+             (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); }
   };
 
   struct stage_info_t {
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
index ee11afb9b65..0f9f60875cc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
@@ -89,7 +89,7 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
 
   for (unsigned int table_index = 0; table_index < 2; table_index++) {
     hb_tag_t table_tag = table_tags[table_index];
-    found_script[table_index] = hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
+    found_script[table_index] = (bool) hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
     hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
   }
 }
@@ -204,11 +204,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m)
     for (unsigned int table_index = 0; table_index < 2; table_index++)
     {
       if (required_feature_tag[table_index] == info->tag)
-      {
         required_feature_stage[table_index] = info->stage[table_index];
-        found = true;
-        continue;
-      }
+
       found |= hb_ot_layout_language_find_feature (face,
                                                    table_tags[table_index],
                                                    script_index[table_index],
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
index 4150dd6bb1e..5b9ed91134e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
@@ -58,7 +58,7 @@ struct maxp
 
   /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
   protected:
-  FixedVersion  version;                /* Version of the maxp table (0.5 or 1.0),
+  FixedVersion<>version;                /* Version of the maxp table (0.5 or 1.0),
                                          * 0x00005000u or 0x00010000u. */
   USHORT        numGlyphs;              /* The number of glyphs in the font. */
   public:
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh
new file mode 100644
index 00000000000..9d3df8de401
--- /dev/null
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_OS2_TABLE_HH
+#define HB_OT_OS2_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+namespace OT {
+
+/*
+ * OS/2 and Windows Metrics
+ * http://www.microsoft.com/typography/otspec/os2.htm
+ */
+
+#define HB_OT_TAG_os2 HB_TAG('O','S','/','2')
+
+struct os2
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_os2;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  USHORT        version;
+
+  /* Version 0 */
+  SHORT         xAvgCharWidth;
+  USHORT        usWeightClass;
+  USHORT        usWidthClass;
+  USHORT        fsType;
+  SHORT         ySubscriptXSize;
+  SHORT         ySubscriptYSize;
+  SHORT         ySubscriptXOffset;
+  SHORT         ySubscriptYOffset;
+  SHORT         ySuperscriptXSize;
+  SHORT         ySuperscriptYSize;
+  SHORT         ySuperscriptXOffset;
+  SHORT         ySuperscriptYOffset;
+  SHORT         yStrikeoutSize;
+  SHORT         yStrikeoutPosition;
+  SHORT         sFamilyClass;
+  BYTE          panose[10];
+  ULONG         ulUnicodeRange[4];
+  Tag           achVendID;
+  USHORT        fsSelection;
+  USHORT        usFirstCharIndex;
+  USHORT        usLastCharIndex;
+  SHORT         sTypoAscender;
+  SHORT         sTypoDescender;
+  SHORT         sTypoLineGap;
+  USHORT        usWinAscent;
+  USHORT        usWinDescent;
+
+  /* Version 1 */
+  //ULONG ulCodePageRange1;
+  //ULONG ulCodePageRange2;
+
+  /* Version 2 */
+  //SHORT sxHeight;
+  //SHORT sCapHeight;
+  //USHORT  usDefaultChar;
+  //USHORT  usBreakChar;
+  //USHORT  usMaxContext;
+
+  /* Version 5 */
+  //USHORT  usLowerOpticalPointSize;
+  //USHORT  usUpperOpticalPointSize;
+
+  public:
+  DEFINE_SIZE_STATIC (78);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_OS2_TABLE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
index cfd6919b43f..2198f765aa2 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-8.0.0.txt
- * # Date: 2015-02-17, 23:33:00 GMT [RP]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # ArabicShaping-9.0.0.txt
+ * # Date: 2016-02-24, 22:25:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
@@ -19,6 +19,7 @@
 
 #define X       JOINING_TYPE_X
 #define R       JOINING_TYPE_R
+#define T       JOINING_TYPE_T
 #define U       JOINING_TYPE_U
 #define A       JOINING_GROUP_ALAPH
 #define DR      JOINING_GROUP_DALATH_RISH
@@ -76,9 +77,11 @@ static const uint8_t joining_table[] =
 
   /* Arabic Extended-A */
 
-  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,
+  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,X,X,
+  /* 08C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 08E0 */ X,X,U,
 
-#define joining_offset_0x1806u 693
+#define joining_offset_0x1806u 739
 
   /* Mongolian */
 
@@ -86,43 +89,48 @@ static const uint8_t joining_table[] =
   /* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
   /* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
   /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,
-  /* 1880 */ U,U,U,U,U,U,U,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
   /* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
 
-#define joining_offset_0x200cu 858
+#define joining_offset_0x200cu 904
 
   /* General Punctuation */
 
-  /* 2000 */                         U,C,
+  /* 2000 */                         U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 2040 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 2060 */ X,X,X,X,X,X,U,U,U,U,
 
-#define joining_offset_0x2066u 860
-
-  /* General Punctuation */
-
-  /* 2060 */             U,U,U,U,
-
-#define joining_offset_0xa840u 864
+#define joining_offset_0xa840u 998
 
   /* Phags-pa */
 
   /* A840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
   /* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
 
-#define joining_offset_0x10ac0u 916
+#define joining_offset_0x10ac0u 1050
 
   /* Manichaean */
 
   /* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
   /* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
 
-#define joining_offset_0x10b80u 964
+#define joining_offset_0x10b80u 1098
 
   /* Psalter Pahlavi */
 
   /* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
   /* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
 
-}; /* Table items: 1012; occupancy: 57% */
+#define joining_offset_0x1e900u 1146
+
+  /* Adlam */
+
+  /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+  /* 1E940 */ D,D,D,D,
+
+}; /* Table items: 1214; occupancy: 54% */
 
 
 static unsigned int
@@ -131,7 +139,7 @@ joining_type (hb_codepoint_t u)
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0600u, 0x08B4u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+      if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
       break;
 
     case 0x1u:
@@ -139,8 +147,7 @@ joining_type (hb_codepoint_t u)
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x200Cu, 0x200Du)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
-      if (hb_in_range (u, 0x2066u, 0x2069u)) return joining_table[u - 0x2066u + joining_offset_0x2066u];
+      if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
       break;
 
     case 0xAu:
@@ -152,6 +159,10 @@ joining_type (hb_codepoint_t u)
       if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
       break;
 
+    case 0x1Eu:
+      if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+      break;
+
     default:
       break;
   }
@@ -160,6 +171,7 @@ joining_type (hb_codepoint_t u)
 
 #undef X
 #undef R
+#undef T
 #undef U
 #undef A
 #undef DR
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
index e749ebbe473..80accdedd75 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
@@ -28,9 +28,38 @@
 #include "hb-ot-shape-private.hh"
 
 
+#ifndef HB_DEBUG_ARABIC
+#define HB_DEBUG_ARABIC (HB_DEBUG+0)
+#endif
+
+
 /* buffer var allocations */
 #define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
 
+#define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
+
+/* See:
+ * https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
+#define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
+        (FLAG_SAFE (gen_cat) & \
+         (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
+          /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
+          /*FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |*/ \
+          /*FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |*/ \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL)))
+
 
 /*
  * Joining types:
@@ -84,7 +113,7 @@ static const hb_tag_t arabic_features[] =
 
 
 /* Same order as the feature array */
-enum {
+enum arabic_action_t {
   ISOL,
   FINA,
   FIN2,
@@ -95,7 +124,11 @@ enum {
 
   NONE,
 
-  ARABIC_NUM_FEATURES = NONE
+  ARABIC_NUM_FEATURES = NONE,
+
+  /* We abuse the same byte for other things... */
+  STCH_FIXED,
+  STCH_REPEATING,
 };
 
 static const struct arabic_state_table_entry {
@@ -139,6 +172,11 @@ arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
                        hb_font_t *font,
                        hb_buffer_t *buffer);
 
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+             hb_font_t *font,
+             hb_buffer_t *buffer);
+
 static void
 collect_features_arabic (hb_ot_shape_planner_t *plan)
 {
@@ -165,6 +203,9 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
 
   map->add_gsub_pause (nuke_joiners);
 
+  map->add_global_bool_feature (HB_TAG('s','t','c','h'));
+  map->add_gsub_pause (record_stch);
+
   map->add_global_bool_feature (HB_TAG('c','c','m','p'));
   map->add_global_bool_feature (HB_TAG('l','o','c','l'));
 
@@ -182,7 +223,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
     map->add_gsub_pause (arabic_fallback_shape);
 
   map->add_global_bool_feature (HB_TAG('c','a','l','t'));
-  map->add_gsub_pause (NULL);
 
   /* The spec includes 'cswh'.  Earlier versions of Windows
    * used to enable this by default, but testing suggests
@@ -192,6 +232,7 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
    * Note that IranNastaliq uses this feature extensively
    * to fixup broken glyph sequences.  Oh well...
    * Test case: U+0643,U+0640,U+0631. */
+  //map->add_gsub_pause (NULL);
   //map->add_global_bool_feature (HB_TAG('c','s','w','h'));
   map->add_global_bool_feature (HB_TAG('m','s','e','t'));
 }
@@ -208,8 +249,10 @@ struct arabic_shape_plan_t
    * mask_array[NONE] == 0. */
   hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1];
 
-  bool do_fallback;
   arabic_fallback_plan_t *fallback_plan;
+
+  unsigned int do_fallback : 1;
+  unsigned int has_stch : 1;
 };
 
 void *
@@ -220,6 +263,7 @@ data_create_arabic (const hb_ot_shape_plan_t *plan)
     return NULL;
 
   arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
+  arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
   for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) {
     arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]);
     arabic_plan->do_fallback = arabic_plan->do_fallback &&
@@ -320,8 +364,6 @@ setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
     info[i].mask |= arabic_plan->mask_array[info[i].arabic_shaping_action()];
-
-  HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
 }
 
 static void
@@ -371,6 +413,197 @@ retry:
   arabic_fallback_plan_shape (fallback_plan, font, buffer);
 }
 
+/*
+ * Stretch feature: "stch".
+ * See example here:
+ * https://www.microsoft.com/typography/OpenTypeDev/syriac/intro.htm
+ * We implement this in a generic way, such that the Arabic subtending
+ * marks can use it as well.
+ */
+
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+             hb_font_t *font,
+             hb_buffer_t *buffer)
+{
+  const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+  if (!arabic_plan->has_stch)
+    return;
+
+  /* 'stch' feature was just applied.  Look for anything that multiplied,
+   * and record it for stch treatment later.  Note that rtlm, frac, etc
+   * are applied before stch, but we assume that they didn't result in
+   * anything multiplying into 5 pieces, so it's safe-ish... */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if (unlikely (_hb_glyph_info_multiplied (&info[i])))
+    {
+      unsigned int comp = _hb_glyph_info_get_lig_comp (&info[i]);
+      info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED;
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH;
+    }
+}
+
+static void
+apply_stch (const hb_ot_shape_plan_t *plan,
+            hb_buffer_t              *buffer,
+            hb_font_t                *font)
+{
+  if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH)))
+    return;
+
+  /* The Arabic shaper currently always processes in RTL mode, so we should
+   * stretch / position the stretched pieces to the left / preceding glyphs. */
+
+  /* We do a two pass implementation:
+   * First pass calculates the exact number of extra glyphs we need,
+   * We then enlarge buffer to have that much room,
+   * Second pass applies the stretch, copying things to the end of buffer.
+   */
+
+  int sign = font->x_scale < 0 ? -1 : +1;
+  unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT
+  typedef enum { MEASURE, CUT } step_t;
+
+  for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1))
+  {
+    unsigned int count = buffer->len;
+    hb_glyph_info_t *info = buffer->info;
+    hb_glyph_position_t *pos = buffer->pos;
+    unsigned int new_len = count + extra_glyphs_needed; // write head during CUT
+    unsigned int j = new_len;
+    for (unsigned int i = count; i; i--)
+    {
+      if (!hb_in_range (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+      {
+        if (step == CUT)
+        {
+          --j;
+          info[j] = info[i - 1];
+          pos[j] = pos[i - 1];
+        }
+        continue;
+      }
+
+      /* Yay, justification! */
+
+      hb_position_t w_total = 0; // Total to be filled
+      hb_position_t w_fixed = 0; // Sum of fixed tiles
+      hb_position_t w_repeating = 0; // Sum of repeating tiles
+      int n_fixed = 0;
+      int n_repeating = 0;
+
+      unsigned int end = i;
+      while (i &&
+             hb_in_range (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+      {
+        i--;
+        hb_position_t width = font->get_glyph_h_advance (info[i].codepoint);
+        if (info[i].arabic_shaping_action() == STCH_FIXED)
+        {
+          w_fixed += width;
+          n_fixed++;
+        }
+        else
+        {
+          w_repeating += width;
+          n_repeating++;
+        }
+      }
+      unsigned int start = i;
+      unsigned int context = i;
+      while (context &&
+             !hb_in_range (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
+             (_hb_glyph_info_is_default_ignorable (&info[context - 1]) ||
+              HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1]))))
+      {
+        context--;
+        w_total += pos[context].x_advance;
+      }
+      i++; // Don't touch i again.
+
+      DEBUG_MSG (ARABIC, NULL, "%s stretch at (%d,%d,%d)",
+                 step == MEASURE ? "measuring" : "cutting", context, start, end);
+      DEBUG_MSG (ARABIC, NULL, "rest of word:    count=%d width %d", start - context, w_total);
+      DEBUG_MSG (ARABIC, NULL, "fixed tiles:     count=%d width=%d", n_fixed, w_fixed);
+      DEBUG_MSG (ARABIC, NULL, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+
+      /* Number of additional times to repeat each repeating tile. */
+      int n_copies = 0;
+
+      hb_position_t w_remaining = w_total - w_fixed;
+      if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
+        n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+
+      /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
+      hb_position_t extra_repeat_overlap = 0;
+      hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+      if (shortfall > 0)
+      {
+        ++n_copies;
+        hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+        if (excess > 0)
+          extra_repeat_overlap = excess / (n_copies * n_repeating);
+      }
+
+      if (step == MEASURE)
+      {
+        extra_glyphs_needed += n_copies * n_repeating;
+        DEBUG_MSG (ARABIC, NULL, "will add extra %d copies of repeating tiles", n_copies);
+      }
+      else
+      {
+        hb_position_t x_offset = 0;
+        for (unsigned int k = end; k > start; k--)
+        {
+          hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint);
+
+          unsigned int repeat = 1;
+          if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
+            repeat += n_copies;
+
+          DEBUG_MSG (ARABIC, NULL, "appending %d copies of glyph %d; j=%d",
+                     repeat, info[k - 1].codepoint, j);
+          for (unsigned int n = 0; n < repeat; n++)
+          {
+            x_offset -= width;
+            if (n > 0)
+              x_offset += extra_repeat_overlap;
+            pos[k - 1].x_offset = x_offset;
+            /* Append copy. */
+            --j;
+            info[j] = info[k - 1];
+            pos[j] = pos[k - 1];
+          }
+        }
+      }
+    }
+
+    if (step == MEASURE)
+    {
+      if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
+        break;
+    }
+    else
+    {
+      assert (j == 0);
+      buffer->len = new_len;
+    }
+  }
+}
+
+
+static void
+postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
+                           hb_buffer_t              *buffer,
+                           hb_font_t                *font)
+{
+  apply_stch (plan, buffer, font);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
+}
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
 {
@@ -379,7 +612,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
   NULL, /* override_features */
   data_create_arabic,
   data_destroy_arabic,
-  NULL, /* preprocess_text_arabic */
+  NULL, /* preprocess_text */
+  postprocess_glyphs_arabic,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   NULL, /* compose */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
index f7f097eedaa..be60e56feb8 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
@@ -35,10 +35,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
   NULL, /* data_create */
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
index 8e85d88e7b1..aa907390a84 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
@@ -188,7 +188,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
                                     */
   unsigned int count = buffer->len;
 
-  for (buffer->idx = 0; buffer->idx < count;)
+  for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
   {
     hb_codepoint_t u = buffer->cur().codepoint;
 
@@ -411,13 +411,14 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
   "hangul",
   collect_features_hangul,
   override_features_hangul,
-  data_create_hangul, /* data_create */
-  data_destroy_hangul, /* data_destroy */
+  data_create_hangul,
+  data_destroy_hangul,
   preprocess_text_hangul,
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
   NULL, /* decompose */
   NULL, /* compose */
-  setup_masks_hangul, /* setup_masks */
+  setup_masks_hangul,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
index ef25badc794..e6fde14dca6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
@@ -68,7 +68,7 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c,
     0xFB4Au /* TAV */
   };
 
-  bool found = c->unicode->compose (a, b, ab);
+  bool found = (bool) c->unicode->compose (a, b, ab);
 
   if (!found && !c->plan->has_mark)
   {
@@ -163,6 +163,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
   NULL, /* data_create */
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   compose_hebrew,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
index 5696b0ad610..d3f0beea43a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
@@ -56,52 +56,52 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = {
         5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u,
         5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u,
         4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u,
-        16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
+        16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+        3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+        3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u,
         5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
         3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
         3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
-        5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
-        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
-        3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
-        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
-        5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
-        4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
-        4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
-        4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u,
+        5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u,
+        1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+        1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+        4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+        4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u,
         9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u,
         5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
         4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
-        3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
-        4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
-        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
-        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
-        3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+        3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+        1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u,
+        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+        3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+        9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+        3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+        4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+        3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u,
+        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+        3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+        9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+        3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+        4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+        3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+        3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u,
+        1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u,
+        5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u,
         3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
-        5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
-        1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u,
-        9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u,
-        4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
-        4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
-        3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u,
-        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0
+        5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+        3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u,
+        9u, 10u, 9u, 9u, 5u, 10u, 0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
@@ -127,52 +127,52 @@ static const char _indic_syllable_machine_key_spans[] = {
         3, 4, 3, 1, 4, 3, 1, 4,
         3, 1, 1, 16, 6, 5, 1, 1,
         5, 1, 1, 5, 1, 1, 5, 1,
-        1, 1, 31, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 10, 10,
+        1, 1, 18, 15, 15, 14, 16, 15,
+        15, 14, 16, 15, 15, 14, 16, 15,
+        15, 14, 16, 15, 15, 14, 10, 10,
         6, 2, 1, 2, 2, 1, 6, 11,
         8, 6, 8, 11, 12, 12, 11, 10,
         12, 11, 10, 12, 11, 10, 12, 11,
-        10, 12, 16, 28, 11, 29, 29, 16,
-        16, 16, 16, 16, 29, 29, 16, 16,
-        16, 16, 16, 29, 29, 16, 16, 16,
-        16, 16, 29, 29, 16, 16, 16, 16,
-        16, 29, 29, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 10, 10,
-        6, 2, 1, 2, 2, 1, 6, 11,
-        8, 6, 8, 11, 12, 12, 11, 10,
-        12, 11, 10, 12, 11, 10, 12, 11,
-        10, 12, 16, 28, 11, 29, 29, 16,
-        16, 16, 16, 16, 29, 29, 16, 16,
-        16, 16, 16, 29, 29, 16, 16, 16,
-        16, 16, 29, 29, 16, 16, 16, 16,
-        11, 16, 29, 29, 28, 16, 29, 29,
-        28, 16, 29, 29, 28, 16, 29, 29,
-        28, 16, 29, 29, 28, 10, 10, 6,
+        10, 12, 16, 11, 15, 15, 16, 16,
+        16, 16, 16, 15, 15, 16, 16, 16,
+        16, 16, 15, 15, 16, 16, 16, 16,
+        16, 15, 15, 16, 16, 16, 16, 16,
+        15, 15, 15, 15, 14, 16, 15, 15,
+        14, 16, 15, 15, 14, 16, 15, 15,
+        14, 16, 15, 15, 14, 10, 10, 6,
         2, 1, 2, 2, 1, 6, 11, 8,
         6, 8, 11, 12, 12, 11, 10, 12,
         11, 10, 12, 11, 10, 12, 11, 10,
-        12, 16, 28, 11, 29, 29, 16, 16,
-        16, 16, 16, 29, 29, 16, 16, 16,
-        16, 16, 29, 29, 16, 16, 16, 16,
-        16, 29, 29, 16, 16, 16, 16, 16,
-        11, 29, 11, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 16, 29,
-        29, 28, 16, 29, 29, 28, 10, 10,
-        6, 2, 1, 2, 2, 1, 6, 11,
-        8, 6, 8, 11, 12, 12, 11, 10,
+        12, 16, 11, 15, 15, 16, 16, 16,
+        16, 16, 15, 15, 16, 16, 16, 16,
+        16, 15, 15, 16, 16, 16, 16, 16,
+        15, 15, 16, 16, 16, 16, 11, 16,
+        15, 15, 14, 16, 15, 15, 14, 16,
+        15, 15, 14, 16, 15, 15, 14, 16,
+        15, 15, 14, 10, 10, 6, 2, 1,
+        2, 2, 1, 6, 11, 8, 6, 8,
+        11, 12, 12, 11, 10, 12, 11, 10,
+        12, 11, 10, 12, 11, 10, 12, 16,
+        11, 15, 15, 16, 16, 16, 16, 16,
+        15, 15, 16, 16, 16, 16, 16, 15,
+        15, 16, 16, 16, 16, 16, 15, 15,
+        16, 16, 16, 16, 16, 11, 15, 11,
+        15, 15, 14, 16, 15, 15, 14, 16,
+        15, 15, 14, 16, 15, 15, 14, 16,
+        15, 15, 14, 10, 10, 6, 2, 1,
+        2, 2, 1, 6, 11, 8, 6, 8,
+        11, 12, 12, 11, 10, 12, 11, 10,
+        12, 11, 10, 12, 11, 10, 12, 16,
+        11, 15, 15, 16, 16, 16, 16, 16,
+        15, 15, 16, 16, 16, 16, 16, 15,
+        15, 16, 16, 16, 16, 16, 15, 15,
+        16, 16, 16, 16, 16, 15, 17, 15,
+        17, 11, 6, 2, 1, 2, 2, 1,
+        6, 16, 15, 15, 14, 15, 15, 16,
         12, 11, 10, 12, 11, 10, 12, 11,
-        10, 12, 16, 28, 11, 29, 29, 16,
-        16, 16, 16, 16, 29, 29, 16, 16,
-        16, 16, 16, 29, 29, 16, 16, 16,
-        16, 16, 29, 29, 16, 16, 16, 16,
-        16, 29, 31, 29, 31, 11, 6, 2,
-        1, 2, 2, 1, 6, 16, 29, 29,
-        28, 29, 29, 16, 12, 11, 10, 12,
-        11, 10, 12, 11, 10, 12, 11, 10,
-        11, 8, 6, 8, 11, 16, 8, 6,
-        6, 2, 1, 2, 2, 1, 6
+        10, 12, 11, 10, 11, 8, 6, 8,
+        11, 16, 8, 6, 6, 2, 1, 2,
+        2, 1, 6
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
@@ -198,52 +198,52 @@ static const short _indic_syllable_machine_index_offsets[] = {
         954, 958, 963, 967, 969, 974, 978, 980,
         985, 989, 991, 993, 1010, 1017, 1023, 1025,
         1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053,
-        1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197,
-        1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409,
-        1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615,
-        1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653,
-        1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740,
-        1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836,
-        1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990,
-        2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152,
-        2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314,
-        2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476,
-        2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676,
-        2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888,
-        2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094,
-        3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132,
-        3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219,
-        3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315,
-        3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469,
-        3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631,
-        3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793,
-        3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955,
-        3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137,
-        4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349,
-        4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536,
-        4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575,
-        4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661,
-        4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758,
-        4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917,
-        4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079,
-        5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241,
-        5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403,
-        5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580,
-        5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792,
-        5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998,
-        6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036,
-        6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123,
-        6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219,
-        6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373,
-        6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535,
-        6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697,
-        6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859,
-        6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036,
-        7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103,
-        7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275,
-        7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372,
-        7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458,
-        7465, 7472, 7475, 7477, 7480, 7483, 7485
+        1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142,
+        1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270,
+        1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392,
+        1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430,
+        1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517,
+        1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613,
+        1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727,
+        1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861,
+        1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995,
+        2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129,
+        2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258,
+        2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386,
+        2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503,
+        2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542,
+        2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628,
+        2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725,
+        2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844,
+        2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978,
+        2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112,
+        3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241,
+        3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369,
+        3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497,
+        3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593,
+        3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638,
+        3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733,
+        3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829,
+        3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958,
+        3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092,
+        4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225,
+        4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354,
+        4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477,
+        4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605,
+        4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701,
+        4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746,
+        4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841,
+        4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937,
+        4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066,
+        5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200,
+        5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333,
+        5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468,
+        5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532,
+        5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637,
+        5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739,
+        5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826,
+        5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892,
+        5895, 5898, 5900
 };
 
 static const short _indic_syllable_machine_indicies[] = {
@@ -381,882 +381,684 @@ static const short _indic_syllable_machine_indicies[] = {
         161, 161, 162, 157, 0, 183, 0, 184,
         0, 186, 185, 188, 189, 190, 191, 192,
         193, 84, 79, 194, 195, 196, 196, 156,
-        197, 198, 199, 200, 201, 187, 187, 187,
-        187, 187, 187, 187, 187, 187, 187, 187,
-        187, 202, 187, 204, 205, 206, 207, 6,
-        1, 208, 209, 203, 203, 38, 210, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 213, 205, 214, 214, 6, 1, 208,
-        209, 203, 203, 203, 210, 203, 203, 211,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 212, 203, 205,
-        214, 214, 6, 1, 208, 209, 203, 203,
-        203, 210, 203, 203, 211, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 212, 203, 215, 203, 203, 203,
-        19, 216, 203, 1, 208, 209, 203, 203,
-        203, 217, 203, 215, 203, 218, 219, 220,
-        221, 6, 1, 208, 209, 203, 203, 36,
-        222, 203, 203, 211, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 212, 203, 223, 219, 224, 224, 6,
-        1, 208, 209, 203, 203, 203, 222, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 219, 224, 224, 6, 1, 208, 209,
-        203, 203, 203, 222, 203, 203, 211, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 212, 203, 225, 203,
-        203, 203, 19, 226, 203, 1, 208, 209,
-        203, 203, 203, 217, 203, 225, 203, 227,
-        228, 229, 230, 6, 1, 208, 209, 203,
-        203, 34, 231, 203, 203, 211, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 212, 203, 232, 228, 233,
-        233, 6, 1, 208, 209, 203, 203, 203,
-        231, 203, 203, 211, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 212, 203, 228, 233, 233, 6, 1,
-        208, 209, 203, 203, 203, 231, 203, 203,
-        211, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 212, 203,
-        234, 203, 203, 203, 19, 235, 203, 1,
-        208, 209, 203, 203, 203, 217, 203, 234,
-        203, 236, 237, 238, 239, 6, 1, 208,
-        209, 203, 203, 32, 240, 203, 203, 211,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 212, 203, 241,
-        237, 242, 242, 6, 1, 208, 209, 203,
-        203, 203, 240, 203, 203, 211, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 212, 203, 237, 242, 242,
-        6, 1, 208, 209, 203, 203, 203, 240,
-        203, 203, 211, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        212, 203, 243, 203, 203, 203, 19, 244,
-        203, 1, 208, 209, 203, 203, 203, 217,
-        203, 243, 203, 245, 246, 247, 248, 6,
-        1, 208, 209, 203, 203, 30, 249, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 250, 246, 251, 251, 6, 1, 208,
-        209, 203, 203, 203, 249, 203, 203, 211,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 212, 203, 246,
-        251, 251, 6, 1, 208, 209, 203, 203,
-        203, 249, 203, 203, 211, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 212, 203, 19, 252, 203, 1,
-        208, 209, 203, 203, 203, 217, 203, 253,
-        253, 203, 1, 208, 209, 203, 203, 203,
-        217, 203, 254, 203, 203, 255, 208, 209,
-        203, 208, 209, 203, 256, 203, 208, 257,
-        203, 208, 258, 203, 208, 203, 254, 203,
-        203, 203, 208, 209, 203, 259, 203, 260,
-        261, 203, 1, 208, 209, 203, 203, 4,
-        203, 3, 203, 253, 253, 203, 1, 208,
-        209, 203, 253, 253, 203, 1, 208, 209,
-        203, 259, 203, 253, 253, 203, 1, 208,
-        209, 203, 259, 203, 260, 253, 203, 1,
-        208, 209, 203, 203, 4, 203, 19, 203,
-        262, 262, 6, 1, 208, 209, 203, 203,
-        203, 217, 203, 263, 28, 264, 265, 9,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        28, 264, 265, 9, 1, 208, 209, 203,
-        203, 203, 217, 203, 264, 264, 9, 1,
-        208, 209, 203, 203, 203, 217, 203, 266,
-        25, 267, 268, 12, 1, 208, 209, 203,
-        203, 203, 217, 203, 25, 267, 268, 12,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        267, 267, 12, 1, 208, 209, 203, 203,
-        203, 217, 203, 269, 22, 270, 271, 15,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        22, 270, 271, 15, 1, 208, 209, 203,
-        203, 203, 217, 203, 270, 270, 15, 1,
-        208, 209, 203, 203, 203, 217, 203, 272,
-        19, 253, 273, 203, 1, 208, 209, 203,
-        203, 203, 217, 203, 19, 253, 273, 203,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        253, 274, 203, 1, 208, 209, 203, 203,
-        203, 217, 203, 19, 203, 253, 253, 203,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        2, 3, 203, 203, 19, 252, 203, 1,
-        208, 209, 203, 203, 203, 217, 203, 2,
-        203, 246, 251, 251, 6, 1, 208, 209,
-        203, 203, 203, 249, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 212, 203, 246, 251,
-        251, 6, 1, 208, 209, 203, 203, 203,
-        249, 203, 245, 246, 251, 251, 6, 1,
-        208, 209, 203, 203, 203, 249, 203, 203,
-        211, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 212, 203,
-        245, 246, 247, 251, 6, 1, 208, 209,
-        203, 203, 30, 249, 203, 203, 211, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 212, 203, 243, 203,
-        275, 203, 262, 262, 6, 1, 208, 209,
-        203, 203, 203, 217, 203, 243, 203, 243,
-        203, 203, 203, 253, 253, 203, 1, 208,
-        209, 203, 203, 203, 217, 203, 243, 203,
-        243, 203, 203, 203, 253, 276, 203, 1,
-        208, 209, 203, 203, 203, 217, 203, 243,
-        203, 243, 203, 275, 203, 253, 253, 203,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        243, 203, 243, 3, 203, 203, 19, 244,
-        203, 1, 208, 209, 203, 203, 203, 217,
-        203, 243, 203, 236, 237, 242, 242, 6,
-        1, 208, 209, 203, 203, 203, 240, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 236, 237, 238, 242, 6, 1, 208,
-        209, 203, 203, 32, 240, 203, 203, 211,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 212, 203, 234,
-        203, 277, 203, 262, 262, 6, 1, 208,
-        209, 203, 203, 203, 217, 203, 234, 203,
-        234, 203, 203, 203, 253, 253, 203, 1,
-        208, 209, 203, 203, 203, 217, 203, 234,
-        203, 234, 203, 203, 203, 253, 278, 203,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        234, 203, 234, 203, 277, 203, 253, 253,
-        203, 1, 208, 209, 203, 203, 203, 217,
-        203, 234, 203, 234, 3, 203, 203, 19,
-        235, 203, 1, 208, 209, 203, 203, 203,
-        217, 203, 234, 203, 227, 228, 233, 233,
-        6, 1, 208, 209, 203, 203, 203, 231,
-        203, 203, 211, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        212, 203, 227, 228, 229, 233, 6, 1,
-        208, 209, 203, 203, 34, 231, 203, 203,
-        211, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 212, 203,
-        225, 203, 279, 203, 262, 262, 6, 1,
-        208, 209, 203, 203, 203, 217, 203, 225,
-        203, 225, 203, 203, 203, 253, 253, 203,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        225, 203, 225, 203, 203, 203, 253, 280,
-        203, 1, 208, 209, 203, 203, 203, 217,
-        203, 225, 203, 225, 203, 279, 203, 253,
-        253, 203, 1, 208, 209, 203, 203, 203,
-        217, 203, 225, 203, 225, 3, 203, 203,
-        19, 226, 203, 1, 208, 209, 203, 203,
-        203, 217, 203, 225, 203, 218, 219, 224,
-        224, 6, 1, 208, 209, 203, 203, 203,
-        222, 203, 203, 211, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 212, 203, 218, 219, 220, 224, 6,
-        1, 208, 209, 203, 203, 36, 222, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 215, 203, 281, 203, 262, 262, 6,
-        1, 208, 209, 203, 203, 203, 217, 203,
-        215, 203, 215, 203, 203, 203, 253, 253,
-        203, 1, 208, 209, 203, 203, 203, 217,
-        203, 215, 203, 215, 203, 203, 203, 253,
-        282, 203, 1, 208, 209, 203, 203, 203,
-        217, 203, 215, 203, 215, 203, 281, 203,
-        253, 253, 203, 1, 208, 209, 203, 203,
-        203, 217, 203, 215, 203, 215, 3, 203,
-        203, 19, 216, 203, 1, 208, 209, 203,
-        203, 203, 217, 203, 215, 203, 204, 205,
-        214, 214, 6, 1, 208, 209, 203, 203,
-        203, 210, 203, 203, 211, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 212, 203, 204, 205, 206, 214,
-        6, 1, 208, 209, 203, 203, 38, 210,
-        203, 203, 211, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        212, 203, 284, 285, 286, 287, 45, 40,
-        288, 289, 283, 283, 77, 290, 283, 283,
-        291, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 292, 283,
-        293, 285, 294, 287, 45, 40, 288, 289,
-        283, 283, 283, 290, 283, 283, 291, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 292, 283, 285, 294,
-        287, 45, 40, 288, 289, 283, 283, 283,
-        290, 283, 283, 291, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 292, 283, 295, 283, 283, 283, 58,
-        296, 283, 40, 288, 289, 283, 283, 283,
-        297, 283, 295, 283, 298, 299, 300, 301,
-        45, 40, 288, 289, 283, 283, 75, 302,
-        283, 283, 291, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        292, 283, 303, 299, 304, 304, 45, 40,
-        288, 289, 283, 283, 283, 302, 283, 283,
-        291, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 292, 283,
-        299, 304, 304, 45, 40, 288, 289, 283,
-        283, 283, 302, 283, 283, 291, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 292, 283, 305, 283, 283,
-        283, 58, 306, 283, 40, 288, 289, 283,
-        283, 283, 297, 283, 305, 283, 307, 308,
-        309, 310, 45, 40, 288, 289, 283, 283,
-        73, 311, 283, 283, 291, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 292, 283, 312, 308, 313, 313,
-        45, 40, 288, 289, 283, 283, 283, 311,
-        283, 283, 291, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        292, 283, 308, 313, 313, 45, 40, 288,
-        289, 283, 283, 283, 311, 283, 283, 291,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 292, 283, 314,
-        283, 283, 283, 58, 315, 283, 40, 288,
-        289, 283, 283, 283, 297, 283, 314, 283,
-        316, 317, 318, 319, 45, 40, 288, 289,
-        283, 283, 71, 320, 283, 283, 291, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 292, 283, 321, 317,
-        322, 322, 45, 40, 288, 289, 283, 283,
-        283, 320, 283, 283, 291, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 292, 283, 317, 322, 322, 45,
-        40, 288, 289, 283, 283, 283, 320, 283,
-        283, 291, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 292,
-        283, 323, 283, 283, 283, 58, 324, 283,
-        40, 288, 289, 283, 283, 283, 297, 283,
-        323, 283, 325, 326, 327, 328, 45, 40,
-        288, 289, 283, 283, 69, 329, 283, 283,
-        291, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 292, 283,
-        330, 326, 331, 331, 45, 40, 288, 289,
-        283, 283, 283, 329, 283, 283, 291, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 292, 283, 326, 331,
-        331, 45, 40, 288, 289, 283, 283, 283,
-        329, 283, 283, 291, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 292, 283, 58, 332, 283, 40, 288,
-        289, 283, 283, 283, 297, 283, 333, 333,
-        283, 40, 288, 289, 283, 283, 283, 297,
-        283, 334, 283, 283, 335, 288, 289, 283,
-        288, 289, 283, 336, 283, 288, 337, 283,
-        288, 338, 283, 288, 283, 334, 283, 283,
-        283, 288, 289, 283, 339, 283, 340, 341,
-        283, 40, 288, 289, 283, 283, 43, 283,
-        42, 283, 333, 333, 283, 40, 288, 289,
-        283, 333, 333, 283, 40, 288, 289, 283,
-        339, 283, 333, 333, 283, 40, 288, 289,
-        283, 339, 283, 340, 333, 283, 40, 288,
-        289, 283, 283, 43, 283, 58, 283, 342,
-        342, 45, 40, 288, 289, 283, 283, 283,
-        297, 283, 343, 67, 344, 345, 48, 40,
-        288, 289, 283, 283, 283, 297, 283, 67,
-        344, 345, 48, 40, 288, 289, 283, 283,
-        283, 297, 283, 344, 344, 48, 40, 288,
-        289, 283, 283, 283, 297, 283, 346, 64,
-        347, 348, 51, 40, 288, 289, 283, 283,
-        283, 297, 283, 64, 347, 348, 51, 40,
-        288, 289, 283, 283, 283, 297, 283, 347,
-        347, 51, 40, 288, 289, 283, 283, 283,
-        297, 283, 349, 61, 350, 351, 54, 40,
-        288, 289, 283, 283, 283, 297, 283, 61,
-        350, 351, 54, 40, 288, 289, 283, 283,
-        283, 297, 283, 350, 350, 54, 40, 288,
-        289, 283, 283, 283, 297, 283, 352, 58,
-        333, 353, 283, 40, 288, 289, 283, 283,
-        283, 297, 283, 58, 333, 353, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 333,
-        354, 283, 40, 288, 289, 283, 283, 283,
-        297, 283, 58, 283, 333, 333, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 41,
-        42, 283, 283, 58, 332, 283, 40, 288,
-        289, 283, 283, 283, 297, 283, 41, 283,
-        326, 331, 331, 45, 40, 288, 289, 283,
-        283, 283, 329, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 292, 283, 326, 331, 331,
-        45, 40, 288, 289, 283, 283, 283, 329,
-        283, 325, 326, 331, 331, 45, 40, 288,
-        289, 283, 283, 283, 329, 283, 283, 291,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 292, 283, 325,
-        326, 327, 331, 45, 40, 288, 289, 283,
-        283, 69, 329, 283, 283, 291, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 292, 283, 323, 283, 355,
-        283, 342, 342, 45, 40, 288, 289, 283,
-        283, 283, 297, 283, 323, 283, 323, 283,
-        283, 283, 333, 333, 283, 40, 288, 289,
-        283, 283, 283, 297, 283, 323, 283, 323,
-        283, 283, 283, 333, 356, 283, 40, 288,
-        289, 283, 283, 283, 297, 283, 323, 283,
-        323, 283, 355, 283, 333, 333, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 323,
-        283, 323, 42, 283, 283, 58, 324, 283,
-        40, 288, 289, 283, 283, 283, 297, 283,
-        323, 283, 316, 317, 322, 322, 45, 40,
-        288, 289, 283, 283, 283, 320, 283, 283,
-        291, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 292, 283,
-        316, 317, 318, 322, 45, 40, 288, 289,
-        283, 283, 71, 320, 283, 283, 291, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 292, 283, 314, 283,
-        357, 283, 342, 342, 45, 40, 288, 289,
-        283, 283, 283, 297, 283, 314, 283, 314,
-        283, 283, 283, 333, 333, 283, 40, 288,
-        289, 283, 283, 283, 297, 283, 314, 283,
-        314, 283, 283, 283, 333, 358, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 314,
-        283, 314, 283, 357, 283, 333, 333, 283,
-        40, 288, 289, 283, 283, 283, 297, 283,
-        314, 283, 314, 42, 283, 283, 58, 315,
-        283, 40, 288, 289, 283, 283, 283, 297,
-        283, 314, 283, 307, 308, 313, 313, 45,
-        40, 288, 289, 283, 283, 283, 311, 283,
-        283, 291, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 292,
-        283, 307, 308, 309, 313, 45, 40, 288,
-        289, 283, 283, 73, 311, 283, 283, 291,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 292, 283, 305,
-        283, 359, 283, 342, 342, 45, 40, 288,
-        289, 283, 283, 283, 297, 283, 305, 283,
-        305, 283, 283, 283, 333, 333, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 305,
-        283, 305, 283, 283, 283, 333, 360, 283,
-        40, 288, 289, 283, 283, 283, 297, 283,
-        305, 283, 305, 283, 359, 283, 333, 333,
-        283, 40, 288, 289, 283, 283, 283, 297,
-        283, 305, 283, 305, 42, 283, 283, 58,
-        306, 283, 40, 288, 289, 283, 283, 283,
-        297, 283, 305, 283, 298, 299, 304, 304,
-        45, 40, 288, 289, 283, 283, 283, 302,
-        283, 283, 291, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        292, 283, 298, 299, 300, 304, 45, 40,
-        288, 289, 283, 283, 75, 302, 283, 283,
-        291, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 283, 292, 283,
-        295, 283, 361, 283, 342, 342, 45, 40,
-        288, 289, 283, 283, 283, 297, 283, 295,
-        283, 295, 283, 283, 283, 333, 333, 283,
-        40, 288, 289, 283, 283, 283, 297, 283,
-        295, 283, 295, 283, 283, 283, 333, 362,
-        283, 40, 288, 289, 283, 283, 283, 297,
-        283, 295, 283, 295, 283, 361, 283, 333,
-        333, 283, 40, 288, 289, 283, 283, 283,
-        297, 283, 295, 283, 76, 44, 44, 45,
-        40, 283, 283, 283, 283, 283, 76, 283,
-        295, 42, 283, 283, 58, 296, 283, 40,
-        288, 289, 283, 283, 283, 297, 283, 295,
-        283, 284, 285, 294, 287, 45, 40, 288,
-        289, 283, 283, 283, 290, 283, 283, 291,
-        283, 283, 283, 283, 283, 283, 283, 283,
-        283, 283, 283, 283, 283, 292, 283, 364,
-        191, 365, 365, 84, 79, 194, 195, 363,
-        363, 363, 197, 363, 363, 200, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 202, 363, 191, 365, 365,
-        84, 79, 194, 195, 363, 363, 363, 197,
-        363, 363, 200, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        202, 363, 366, 363, 363, 363, 98, 367,
-        363, 79, 194, 195, 363, 363, 363, 368,
-        363, 366, 363, 369, 370, 371, 372, 84,
-        79, 194, 195, 363, 363, 115, 373, 363,
-        363, 200, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 202,
-        363, 374, 370, 375, 375, 84, 79, 194,
-        195, 363, 363, 363, 373, 363, 363, 200,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 202, 363, 370,
-        375, 375, 84, 79, 194, 195, 363, 363,
-        363, 373, 363, 363, 200, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 202, 363, 376, 363, 363, 363,
-        98, 377, 363, 79, 194, 195, 363, 363,
-        363, 368, 363, 376, 363, 378, 379, 380,
-        381, 84, 79, 194, 195, 363, 363, 113,
-        382, 363, 363, 200, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 202, 363, 383, 379, 384, 384, 84,
-        79, 194, 195, 363, 363, 363, 382, 363,
-        363, 200, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 202,
-        363, 379, 384, 384, 84, 79, 194, 195,
-        363, 363, 363, 382, 363, 363, 200, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 202, 363, 385, 363,
-        363, 363, 98, 386, 363, 79, 194, 195,
-        363, 363, 363, 368, 363, 385, 363, 387,
-        388, 389, 390, 84, 79, 194, 195, 363,
-        363, 111, 391, 363, 363, 200, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 202, 363, 392, 388, 393,
-        393, 84, 79, 194, 195, 363, 363, 363,
-        391, 363, 363, 200, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 202, 363, 388, 393, 393, 84, 79,
-        194, 195, 363, 363, 363, 391, 363, 363,
-        200, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 202, 363,
-        394, 363, 363, 363, 98, 395, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 394,
-        363, 396, 397, 398, 399, 84, 79, 194,
-        195, 363, 363, 109, 400, 363, 363, 200,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 202, 363, 401,
-        397, 402, 402, 84, 79, 194, 195, 363,
-        363, 363, 400, 363, 363, 200, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 202, 363, 397, 402, 402,
-        84, 79, 194, 195, 363, 363, 363, 400,
-        363, 363, 200, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        202, 363, 98, 403, 363, 79, 194, 195,
-        363, 363, 363, 368, 363, 404, 404, 363,
-        79, 194, 195, 363, 363, 363, 368, 363,
-        405, 363, 363, 406, 194, 195, 363, 194,
-        195, 363, 407, 363, 194, 408, 363, 194,
-        409, 363, 194, 363, 405, 363, 363, 363,
-        194, 195, 363, 410, 363, 411, 412, 363,
-        79, 194, 195, 363, 363, 82, 363, 81,
-        363, 404, 404, 363, 79, 194, 195, 363,
-        404, 404, 363, 79, 194, 195, 363, 410,
-        363, 404, 404, 363, 79, 194, 195, 363,
-        410, 363, 411, 404, 363, 79, 194, 195,
-        363, 363, 82, 363, 98, 363, 413, 413,
-        84, 79, 194, 195, 363, 363, 363, 368,
-        363, 414, 107, 415, 416, 88, 79, 194,
-        195, 363, 363, 363, 368, 363, 107, 415,
-        416, 88, 79, 194, 195, 363, 363, 363,
-        368, 363, 415, 415, 88, 79, 194, 195,
-        363, 363, 363, 368, 363, 417, 104, 418,
-        419, 91, 79, 194, 195, 363, 363, 363,
-        368, 363, 104, 418, 419, 91, 79, 194,
-        195, 363, 363, 363, 368, 363, 418, 418,
-        91, 79, 194, 195, 363, 363, 363, 368,
-        363, 420, 101, 421, 422, 94, 79, 194,
-        195, 363, 363, 363, 368, 363, 101, 421,
-        422, 94, 79, 194, 195, 363, 363, 363,
-        368, 363, 421, 421, 94, 79, 194, 195,
-        363, 363, 363, 368, 363, 423, 98, 404,
-        424, 363, 79, 194, 195, 363, 363, 363,
-        368, 363, 98, 404, 424, 363, 79, 194,
-        195, 363, 363, 363, 368, 363, 404, 425,
-        363, 79, 194, 195, 363, 363, 363, 368,
-        363, 98, 363, 404, 404, 363, 79, 194,
-        195, 363, 363, 363, 368, 363, 80, 81,
-        363, 363, 98, 403, 363, 79, 194, 195,
-        363, 363, 363, 368, 363, 80, 363, 397,
-        402, 402, 84, 79, 194, 195, 363, 363,
-        363, 400, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 202, 363, 397, 402, 402, 84,
-        79, 194, 195, 363, 363, 363, 400, 363,
-        396, 397, 402, 402, 84, 79, 194, 195,
-        363, 363, 363, 400, 363, 363, 200, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 202, 363, 396, 397,
-        398, 402, 84, 79, 194, 195, 363, 363,
-        109, 400, 363, 363, 200, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 202, 363, 394, 363, 426, 363,
-        413, 413, 84, 79, 194, 195, 363, 363,
-        363, 368, 363, 394, 363, 394, 363, 363,
-        363, 404, 404, 363, 79, 194, 195, 363,
-        363, 363, 368, 363, 394, 363, 394, 363,
-        363, 363, 404, 427, 363, 79, 194, 195,
-        363, 363, 363, 368, 363, 394, 363, 394,
-        363, 426, 363, 404, 404, 363, 79, 194,
-        195, 363, 363, 363, 368, 363, 394, 363,
-        394, 81, 363, 363, 98, 395, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 394,
-        363, 387, 388, 393, 393, 84, 79, 194,
-        195, 363, 363, 363, 391, 363, 363, 200,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 202, 363, 387,
-        388, 389, 393, 84, 79, 194, 195, 363,
-        363, 111, 391, 363, 363, 200, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 202, 363, 385, 363, 428,
-        363, 413, 413, 84, 79, 194, 195, 363,
-        363, 363, 368, 363, 385, 363, 385, 363,
-        363, 363, 404, 404, 363, 79, 194, 195,
-        363, 363, 363, 368, 363, 385, 363, 385,
-        363, 363, 363, 404, 429, 363, 79, 194,
-        195, 363, 363, 363, 368, 363, 385, 363,
-        385, 363, 428, 363, 404, 404, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 385,
-        363, 385, 81, 363, 363, 98, 386, 363,
-        79, 194, 195, 363, 363, 363, 368, 363,
-        385, 363, 378, 379, 384, 384, 84, 79,
-        194, 195, 363, 363, 363, 382, 363, 363,
-        200, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 202, 363,
-        378, 379, 380, 384, 84, 79, 194, 195,
-        363, 363, 113, 382, 363, 363, 200, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 202, 363, 376, 363,
-        430, 363, 413, 413, 84, 79, 194, 195,
-        363, 363, 363, 368, 363, 376, 363, 376,
-        363, 363, 363, 404, 404, 363, 79, 194,
-        195, 363, 363, 363, 368, 363, 376, 363,
-        376, 363, 363, 363, 404, 431, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 376,
-        363, 376, 363, 430, 363, 404, 404, 363,
-        79, 194, 195, 363, 363, 363, 368, 363,
-        376, 363, 376, 81, 363, 363, 98, 377,
-        363, 79, 194, 195, 363, 363, 363, 368,
-        363, 376, 363, 369, 370, 375, 375, 84,
-        79, 194, 195, 363, 363, 363, 373, 363,
-        363, 200, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 202,
-        363, 369, 370, 371, 375, 84, 79, 194,
-        195, 363, 363, 115, 373, 363, 363, 200,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 202, 363, 366,
-        363, 432, 363, 413, 413, 84, 79, 194,
-        195, 363, 363, 363, 368, 363, 366, 363,
-        366, 363, 363, 363, 404, 404, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 366,
-        363, 366, 363, 363, 363, 404, 433, 363,
-        79, 194, 195, 363, 363, 363, 368, 363,
-        366, 363, 366, 363, 432, 363, 404, 404,
-        363, 79, 194, 195, 363, 363, 363, 368,
-        363, 366, 363, 366, 81, 363, 363, 98,
-        367, 363, 79, 194, 195, 363, 363, 363,
-        368, 363, 366, 363, 116, 83, 83, 84,
-        79, 434, 434, 434, 434, 156, 116, 434,
-        190, 191, 365, 365, 84, 79, 194, 195,
-        363, 363, 363, 197, 363, 363, 200, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 363, 363, 363, 202, 363, 116, 83,
-        83, 84, 79, 434, 434, 434, 434, 434,
-        116, 434, 436, 437, 438, 439, 123, 118,
-        440, 441, 435, 435, 155, 442, 435, 435,
-        443, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 444, 435,
-        445, 437, 439, 439, 123, 118, 440, 441,
-        435, 435, 435, 442, 435, 435, 443, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 444, 435, 437, 439,
-        439, 123, 118, 440, 441, 435, 435, 435,
-        442, 435, 435, 443, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 444, 435, 446, 435, 435, 435, 136,
-        447, 435, 118, 440, 441, 435, 435, 435,
-        448, 435, 446, 435, 449, 450, 451, 452,
-        123, 118, 440, 441, 435, 435, 153, 453,
-        435, 435, 443, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        444, 435, 454, 450, 455, 455, 123, 118,
-        440, 441, 435, 435, 435, 453, 435, 435,
-        443, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 444, 435,
-        450, 455, 455, 123, 118, 440, 441, 435,
-        435, 435, 453, 435, 435, 443, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 444, 435, 456, 435, 435,
-        435, 136, 457, 435, 118, 440, 441, 435,
-        435, 435, 448, 435, 456, 435, 458, 459,
-        460, 461, 123, 118, 440, 441, 435, 435,
-        151, 462, 435, 435, 443, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 444, 435, 463, 459, 464, 464,
-        123, 118, 440, 441, 435, 435, 435, 462,
-        435, 435, 443, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        444, 435, 459, 464, 464, 123, 118, 440,
-        441, 435, 435, 435, 462, 435, 435, 443,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 444, 435, 465,
-        435, 435, 435, 136, 466, 435, 118, 440,
-        441, 435, 435, 435, 448, 435, 465, 435,
-        467, 468, 469, 470, 123, 118, 440, 441,
-        435, 435, 149, 471, 435, 435, 443, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 444, 435, 472, 468,
-        473, 473, 123, 118, 440, 441, 435, 435,
-        435, 471, 435, 435, 443, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 444, 435, 468, 473, 473, 123,
-        118, 440, 441, 435, 435, 435, 471, 435,
-        435, 443, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 444,
-        435, 474, 435, 435, 435, 136, 475, 435,
-        118, 440, 441, 435, 435, 435, 448, 435,
-        474, 435, 476, 477, 478, 479, 123, 118,
-        440, 441, 435, 435, 147, 480, 435, 435,
-        443, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 444, 435,
-        481, 477, 482, 482, 123, 118, 440, 441,
-        435, 435, 435, 480, 435, 435, 443, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 444, 435, 477, 482,
-        482, 123, 118, 440, 441, 435, 435, 435,
-        480, 435, 435, 443, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 444, 435, 136, 483, 435, 118, 440,
-        441, 435, 435, 435, 448, 435, 484, 484,
-        435, 118, 440, 441, 435, 435, 435, 448,
-        435, 485, 435, 435, 486, 440, 441, 435,
-        440, 441, 435, 487, 435, 440, 488, 435,
-        440, 489, 435, 440, 435, 485, 435, 435,
-        435, 440, 441, 435, 490, 435, 491, 492,
-        435, 118, 440, 441, 435, 435, 121, 435,
-        120, 435, 484, 484, 435, 118, 440, 441,
-        435, 484, 484, 435, 118, 440, 441, 435,
-        490, 435, 484, 484, 435, 118, 440, 441,
-        435, 490, 435, 491, 484, 435, 118, 440,
-        441, 435, 435, 121, 435, 136, 435, 493,
-        493, 123, 118, 440, 441, 435, 435, 435,
-        448, 435, 494, 145, 495, 496, 126, 118,
-        440, 441, 435, 435, 435, 448, 435, 145,
-        495, 496, 126, 118, 440, 441, 435, 435,
-        435, 448, 435, 495, 495, 126, 118, 440,
-        441, 435, 435, 435, 448, 435, 497, 142,
-        498, 499, 129, 118, 440, 441, 435, 435,
-        435, 448, 435, 142, 498, 499, 129, 118,
-        440, 441, 435, 435, 435, 448, 435, 498,
-        498, 129, 118, 440, 441, 435, 435, 435,
-        448, 435, 500, 139, 501, 502, 132, 118,
-        440, 441, 435, 435, 435, 448, 435, 139,
-        501, 502, 132, 118, 440, 441, 435, 435,
-        435, 448, 435, 501, 501, 132, 118, 440,
-        441, 435, 435, 435, 448, 435, 503, 136,
-        484, 504, 435, 118, 440, 441, 435, 435,
-        435, 448, 435, 136, 484, 504, 435, 118,
-        440, 441, 435, 435, 435, 448, 435, 484,
-        505, 435, 118, 440, 441, 435, 435, 435,
-        448, 435, 136, 435, 484, 484, 435, 118,
-        440, 441, 435, 435, 435, 448, 435, 119,
-        120, 435, 435, 136, 483, 435, 118, 440,
-        441, 435, 435, 435, 448, 435, 119, 435,
-        477, 482, 482, 123, 118, 440, 441, 435,
-        435, 435, 480, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 444, 435, 477, 482, 482,
-        123, 118, 440, 441, 435, 435, 435, 480,
-        435, 476, 477, 482, 482, 123, 118, 440,
-        441, 435, 435, 435, 480, 435, 435, 443,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 444, 435, 476,
-        477, 478, 482, 123, 118, 440, 441, 435,
-        435, 147, 480, 435, 435, 443, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 444, 435, 474, 435, 506,
-        435, 493, 493, 123, 118, 440, 441, 435,
-        435, 435, 448, 435, 474, 435, 474, 435,
-        435, 435, 484, 484, 435, 118, 440, 441,
-        435, 435, 435, 448, 435, 474, 435, 474,
-        435, 435, 435, 484, 507, 435, 118, 440,
-        441, 435, 435, 435, 448, 435, 474, 435,
-        474, 435, 506, 435, 484, 484, 435, 118,
-        440, 441, 435, 435, 435, 448, 435, 474,
-        435, 474, 120, 435, 435, 136, 475, 435,
-        118, 440, 441, 435, 435, 435, 448, 435,
-        474, 435, 467, 468, 473, 473, 123, 118,
-        440, 441, 435, 435, 435, 471, 435, 435,
-        443, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 444, 435,
-        467, 468, 469, 473, 123, 118, 440, 441,
-        435, 435, 149, 471, 435, 435, 443, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 444, 435, 465, 435,
-        508, 435, 493, 493, 123, 118, 440, 441,
-        435, 435, 435, 448, 435, 465, 435, 465,
-        435, 435, 435, 484, 484, 435, 118, 440,
-        441, 435, 435, 435, 448, 435, 465, 435,
-        465, 435, 435, 435, 484, 509, 435, 118,
-        440, 441, 435, 435, 435, 448, 435, 465,
-        435, 465, 435, 508, 435, 484, 484, 435,
-        118, 440, 441, 435, 435, 435, 448, 435,
-        465, 435, 465, 120, 435, 435, 136, 466,
-        435, 118, 440, 441, 435, 435, 435, 448,
-        435, 465, 435, 458, 459, 464, 464, 123,
-        118, 440, 441, 435, 435, 435, 462, 435,
-        435, 443, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 444,
-        435, 458, 459, 460, 464, 123, 118, 440,
-        441, 435, 435, 151, 462, 435, 435, 443,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 444, 435, 456,
-        435, 510, 435, 493, 493, 123, 118, 440,
-        441, 435, 435, 435, 448, 435, 456, 435,
-        456, 435, 435, 435, 484, 484, 435, 118,
-        440, 441, 435, 435, 435, 448, 435, 456,
-        435, 456, 435, 435, 435, 484, 511, 435,
-        118, 440, 441, 435, 435, 435, 448, 435,
-        456, 435, 456, 435, 510, 435, 484, 484,
-        435, 118, 440, 441, 435, 435, 435, 448,
-        435, 456, 435, 456, 120, 435, 435, 136,
-        457, 435, 118, 440, 441, 435, 435, 435,
-        448, 435, 456, 435, 449, 450, 455, 455,
-        123, 118, 440, 441, 435, 435, 435, 453,
-        435, 435, 443, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        444, 435, 449, 450, 451, 455, 123, 118,
-        440, 441, 435, 435, 153, 453, 435, 435,
-        443, 435, 435, 435, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 444, 435,
-        446, 435, 512, 435, 493, 493, 123, 118,
-        440, 441, 435, 435, 435, 448, 435, 446,
-        435, 446, 435, 435, 435, 484, 484, 435,
-        118, 440, 441, 435, 435, 435, 448, 435,
-        446, 435, 446, 435, 435, 435, 484, 513,
-        435, 118, 440, 441, 435, 435, 435, 448,
-        435, 446, 435, 446, 435, 512, 435, 484,
-        484, 435, 118, 440, 441, 435, 435, 435,
-        448, 435, 446, 435, 446, 120, 435, 435,
-        136, 447, 435, 118, 440, 441, 435, 435,
-        435, 448, 435, 446, 435, 436, 437, 439,
-        439, 123, 118, 440, 441, 435, 435, 435,
-        442, 435, 435, 443, 435, 435, 435, 435,
-        435, 435, 435, 435, 435, 435, 435, 435,
-        435, 444, 435, 188, 189, 190, 191, 514,
-        365, 84, 79, 194, 195, 196, 196, 156,
-        197, 363, 188, 200, 363, 363, 363, 363,
-        363, 363, 363, 363, 363, 363, 363, 363,
-        363, 202, 363, 204, 515, 206, 207, 6,
-        1, 208, 209, 203, 203, 38, 210, 203,
-        203, 211, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 212,
-        203, 215, 189, 190, 191, 516, 517, 84,
-        157, 518, 519, 203, 196, 156, 520, 203,
-        215, 200, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 202,
-        203, 116, 521, 521, 84, 157, 208, 209,
-        203, 203, 156, 522, 203, 523, 203, 203,
-        524, 518, 519, 203, 518, 519, 203, 256,
-        203, 518, 525, 203, 518, 526, 203, 518,
-        203, 523, 203, 203, 203, 518, 519, 203,
-        527, 3, 363, 363, 404, 433, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 527,
-        363, 528, 370, 529, 530, 84, 157, 518,
-        519, 203, 203, 158, 373, 203, 203, 200,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 202, 203, 531,
-        370, 532, 532, 84, 157, 518, 519, 203,
-        203, 203, 373, 203, 203, 200, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 202, 203, 370, 532, 532,
-        84, 157, 518, 519, 203, 203, 203, 373,
-        203, 203, 200, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        202, 203, 528, 370, 532, 532, 84, 157,
-        518, 519, 203, 203, 203, 373, 203, 203,
-        200, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 203, 203, 202, 203,
-        528, 370, 529, 532, 84, 157, 518, 519,
-        203, 203, 158, 373, 203, 203, 200, 203,
-        203, 203, 203, 203, 203, 203, 203, 203,
-        203, 203, 203, 203, 202, 203, 215, 203,
-        281, 116, 533, 533, 160, 157, 208, 209,
-        203, 203, 203, 522, 203, 215, 203, 534,
-        184, 535, 536, 162, 157, 518, 519, 203,
-        203, 203, 537, 203, 184, 535, 536, 162,
-        157, 518, 519, 203, 203, 203, 537, 203,
-        535, 535, 162, 157, 518, 519, 203, 203,
-        203, 537, 203, 538, 181, 539, 540, 165,
-        157, 518, 519, 203, 203, 203, 537, 203,
-        181, 539, 540, 165, 157, 518, 519, 203,
-        203, 203, 537, 203, 539, 539, 165, 157,
-        518, 519, 203, 203, 203, 537, 203, 541,
-        178, 542, 543, 168, 157, 518, 519, 203,
-        203, 203, 537, 203, 178, 542, 543, 168,
-        157, 518, 519, 203, 203, 203, 537, 203,
-        542, 542, 168, 157, 518, 519, 203, 203,
-        203, 537, 203, 544, 175, 545, 546, 203,
-        157, 518, 519, 203, 203, 203, 537, 203,
-        175, 545, 546, 203, 157, 518, 519, 203,
-        203, 203, 537, 203, 545, 545, 203, 157,
-        518, 519, 203, 203, 203, 537, 203, 547,
-        203, 548, 549, 203, 157, 518, 519, 203,
-        203, 172, 203, 171, 203, 545, 545, 203,
-        157, 518, 519, 203, 545, 545, 203, 157,
-        518, 519, 203, 547, 203, 545, 545, 203,
-        157, 518, 519, 203, 547, 203, 548, 545,
-        203, 157, 518, 519, 203, 203, 172, 203,
-        527, 171, 363, 363, 98, 367, 363, 79,
-        194, 195, 363, 363, 363, 368, 363, 527,
-        363, 551, 550, 552, 552, 550, 186, 553,
-        554, 550, 552, 552, 550, 186, 553, 554,
-        550, 555, 550, 550, 556, 553, 554, 550,
-        553, 554, 550, 557, 550, 553, 558, 550,
-        553, 559, 550, 553, 550, 555, 550, 550,
-        550, 553, 554, 550, 0
+        197, 198, 199, 200, 201, 187, 203, 204,
+        205, 206, 6, 1, 207, 208, 202, 202,
+        38, 209, 202, 202, 210, 202, 211, 204,
+        212, 212, 6, 1, 207, 208, 202, 202,
+        202, 209, 202, 202, 210, 202, 204, 212,
+        212, 6, 1, 207, 208, 202, 202, 202,
+        209, 202, 202, 210, 202, 213, 202, 202,
+        202, 19, 214, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 213, 202, 216, 217,
+        218, 219, 6, 1, 207, 208, 202, 202,
+        36, 220, 202, 202, 210, 202, 221, 217,
+        222, 222, 6, 1, 207, 208, 202, 202,
+        202, 220, 202, 202, 210, 202, 217, 222,
+        222, 6, 1, 207, 208, 202, 202, 202,
+        220, 202, 202, 210, 202, 223, 202, 202,
+        202, 19, 224, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 223, 202, 225, 226,
+        227, 228, 6, 1, 207, 208, 202, 202,
+        34, 229, 202, 202, 210, 202, 230, 226,
+        231, 231, 6, 1, 207, 208, 202, 202,
+        202, 229, 202, 202, 210, 202, 226, 231,
+        231, 6, 1, 207, 208, 202, 202, 202,
+        229, 202, 202, 210, 202, 232, 202, 202,
+        202, 19, 233, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 232, 202, 234, 235,
+        236, 237, 6, 1, 207, 208, 202, 202,
+        32, 238, 202, 202, 210, 202, 239, 235,
+        240, 240, 6, 1, 207, 208, 202, 202,
+        202, 238, 202, 202, 210, 202, 235, 240,
+        240, 6, 1, 207, 208, 202, 202, 202,
+        238, 202, 202, 210, 202, 241, 202, 202,
+        202, 19, 242, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 241, 202, 243, 244,
+        245, 246, 6, 1, 207, 208, 202, 202,
+        30, 247, 202, 202, 210, 202, 248, 244,
+        249, 249, 6, 1, 207, 208, 202, 202,
+        202, 247, 202, 202, 210, 202, 244, 249,
+        249, 6, 1, 207, 208, 202, 202, 202,
+        247, 202, 202, 210, 202, 19, 250, 202,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        251, 251, 202, 1, 207, 208, 202, 202,
+        202, 215, 202, 252, 202, 202, 253, 207,
+        208, 202, 207, 208, 202, 254, 202, 207,
+        255, 202, 207, 256, 202, 207, 202, 252,
+        202, 202, 202, 207, 208, 202, 257, 202,
+        258, 259, 202, 1, 207, 208, 202, 202,
+        4, 202, 3, 202, 251, 251, 202, 1,
+        207, 208, 202, 251, 251, 202, 1, 207,
+        208, 202, 257, 202, 251, 251, 202, 1,
+        207, 208, 202, 257, 202, 258, 251, 202,
+        1, 207, 208, 202, 202, 4, 202, 19,
+        202, 260, 260, 6, 1, 207, 208, 202,
+        202, 202, 215, 202, 261, 28, 262, 263,
+        9, 1, 207, 208, 202, 202, 202, 215,
+        202, 28, 262, 263, 9, 1, 207, 208,
+        202, 202, 202, 215, 202, 262, 262, 9,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        264, 25, 265, 266, 12, 1, 207, 208,
+        202, 202, 202, 215, 202, 25, 265, 266,
+        12, 1, 207, 208, 202, 202, 202, 215,
+        202, 265, 265, 12, 1, 207, 208, 202,
+        202, 202, 215, 202, 267, 22, 268, 269,
+        15, 1, 207, 208, 202, 202, 202, 215,
+        202, 22, 268, 269, 15, 1, 207, 208,
+        202, 202, 202, 215, 202, 268, 268, 15,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        270, 19, 251, 271, 202, 1, 207, 208,
+        202, 202, 202, 215, 202, 19, 251, 271,
+        202, 1, 207, 208, 202, 202, 202, 215,
+        202, 251, 272, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 19, 202, 251, 251,
+        202, 1, 207, 208, 202, 202, 202, 215,
+        202, 2, 3, 202, 202, 19, 250, 202,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        2, 202, 244, 249, 249, 6, 1, 207,
+        208, 202, 202, 202, 247, 202, 243, 244,
+        249, 249, 6, 1, 207, 208, 202, 202,
+        202, 247, 202, 202, 210, 202, 243, 244,
+        245, 249, 6, 1, 207, 208, 202, 202,
+        30, 247, 202, 202, 210, 202, 241, 202,
+        273, 202, 260, 260, 6, 1, 207, 208,
+        202, 202, 202, 215, 202, 241, 202, 241,
+        202, 202, 202, 251, 251, 202, 1, 207,
+        208, 202, 202, 202, 215, 202, 241, 202,
+        241, 202, 202, 202, 251, 274, 202, 1,
+        207, 208, 202, 202, 202, 215, 202, 241,
+        202, 241, 202, 273, 202, 251, 251, 202,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        241, 202, 241, 3, 202, 202, 19, 242,
+        202, 1, 207, 208, 202, 202, 202, 215,
+        202, 241, 202, 234, 235, 240, 240, 6,
+        1, 207, 208, 202, 202, 202, 238, 202,
+        202, 210, 202, 234, 235, 236, 240, 6,
+        1, 207, 208, 202, 202, 32, 238, 202,
+        202, 210, 202, 232, 202, 275, 202, 260,
+        260, 6, 1, 207, 208, 202, 202, 202,
+        215, 202, 232, 202, 232, 202, 202, 202,
+        251, 251, 202, 1, 207, 208, 202, 202,
+        202, 215, 202, 232, 202, 232, 202, 202,
+        202, 251, 276, 202, 1, 207, 208, 202,
+        202, 202, 215, 202, 232, 202, 232, 202,
+        275, 202, 251, 251, 202, 1, 207, 208,
+        202, 202, 202, 215, 202, 232, 202, 232,
+        3, 202, 202, 19, 233, 202, 1, 207,
+        208, 202, 202, 202, 215, 202, 232, 202,
+        225, 226, 231, 231, 6, 1, 207, 208,
+        202, 202, 202, 229, 202, 202, 210, 202,
+        225, 226, 227, 231, 6, 1, 207, 208,
+        202, 202, 34, 229, 202, 202, 210, 202,
+        223, 202, 277, 202, 260, 260, 6, 1,
+        207, 208, 202, 202, 202, 215, 202, 223,
+        202, 223, 202, 202, 202, 251, 251, 202,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        223, 202, 223, 202, 202, 202, 251, 278,
+        202, 1, 207, 208, 202, 202, 202, 215,
+        202, 223, 202, 223, 202, 277, 202, 251,
+        251, 202, 1, 207, 208, 202, 202, 202,
+        215, 202, 223, 202, 223, 3, 202, 202,
+        19, 224, 202, 1, 207, 208, 202, 202,
+        202, 215, 202, 223, 202, 216, 217, 222,
+        222, 6, 1, 207, 208, 202, 202, 202,
+        220, 202, 202, 210, 202, 216, 217, 218,
+        222, 6, 1, 207, 208, 202, 202, 36,
+        220, 202, 202, 210, 202, 213, 202, 279,
+        202, 260, 260, 6, 1, 207, 208, 202,
+        202, 202, 215, 202, 213, 202, 213, 202,
+        202, 202, 251, 251, 202, 1, 207, 208,
+        202, 202, 202, 215, 202, 213, 202, 213,
+        202, 202, 202, 251, 280, 202, 1, 207,
+        208, 202, 202, 202, 215, 202, 213, 202,
+        213, 202, 279, 202, 251, 251, 202, 1,
+        207, 208, 202, 202, 202, 215, 202, 213,
+        202, 213, 3, 202, 202, 19, 214, 202,
+        1, 207, 208, 202, 202, 202, 215, 202,
+        213, 202, 203, 204, 212, 212, 6, 1,
+        207, 208, 202, 202, 202, 209, 202, 202,
+        210, 202, 203, 204, 205, 212, 6, 1,
+        207, 208, 202, 202, 38, 209, 202, 202,
+        210, 202, 282, 283, 284, 285, 45, 40,
+        286, 287, 281, 281, 77, 288, 281, 281,
+        289, 281, 290, 283, 291, 285, 45, 40,
+        286, 287, 281, 281, 281, 288, 281, 281,
+        289, 281, 283, 291, 285, 45, 40, 286,
+        287, 281, 281, 281, 288, 281, 281, 289,
+        281, 292, 281, 281, 281, 58, 293, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        292, 281, 295, 296, 297, 298, 45, 40,
+        286, 287, 281, 281, 75, 299, 281, 281,
+        289, 281, 300, 296, 301, 301, 45, 40,
+        286, 287, 281, 281, 281, 299, 281, 281,
+        289, 281, 296, 301, 301, 45, 40, 286,
+        287, 281, 281, 281, 299, 281, 281, 289,
+        281, 302, 281, 281, 281, 58, 303, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        302, 281, 304, 305, 306, 307, 45, 40,
+        286, 287, 281, 281, 73, 308, 281, 281,
+        289, 281, 309, 305, 310, 310, 45, 40,
+        286, 287, 281, 281, 281, 308, 281, 281,
+        289, 281, 305, 310, 310, 45, 40, 286,
+        287, 281, 281, 281, 308, 281, 281, 289,
+        281, 311, 281, 281, 281, 58, 312, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        311, 281, 313, 314, 315, 316, 45, 40,
+        286, 287, 281, 281, 71, 317, 281, 281,
+        289, 281, 318, 314, 319, 319, 45, 40,
+        286, 287, 281, 281, 281, 317, 281, 281,
+        289, 281, 314, 319, 319, 45, 40, 286,
+        287, 281, 281, 281, 317, 281, 281, 289,
+        281, 320, 281, 281, 281, 58, 321, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        320, 281, 322, 323, 324, 325, 45, 40,
+        286, 287, 281, 281, 69, 326, 281, 281,
+        289, 281, 327, 323, 328, 328, 45, 40,
+        286, 287, 281, 281, 281, 326, 281, 281,
+        289, 281, 323, 328, 328, 45, 40, 286,
+        287, 281, 281, 281, 326, 281, 281, 289,
+        281, 58, 329, 281, 40, 286, 287, 281,
+        281, 281, 294, 281, 330, 330, 281, 40,
+        286, 287, 281, 281, 281, 294, 281, 331,
+        281, 281, 332, 286, 287, 281, 286, 287,
+        281, 333, 281, 286, 334, 281, 286, 335,
+        281, 286, 281, 331, 281, 281, 281, 286,
+        287, 281, 336, 281, 337, 338, 281, 40,
+        286, 287, 281, 281, 43, 281, 42, 281,
+        330, 330, 281, 40, 286, 287, 281, 330,
+        330, 281, 40, 286, 287, 281, 336, 281,
+        330, 330, 281, 40, 286, 287, 281, 336,
+        281, 337, 330, 281, 40, 286, 287, 281,
+        281, 43, 281, 58, 281, 339, 339, 45,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        340, 67, 341, 342, 48, 40, 286, 287,
+        281, 281, 281, 294, 281, 67, 341, 342,
+        48, 40, 286, 287, 281, 281, 281, 294,
+        281, 341, 341, 48, 40, 286, 287, 281,
+        281, 281, 294, 281, 343, 64, 344, 345,
+        51, 40, 286, 287, 281, 281, 281, 294,
+        281, 64, 344, 345, 51, 40, 286, 287,
+        281, 281, 281, 294, 281, 344, 344, 51,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        346, 61, 347, 348, 54, 40, 286, 287,
+        281, 281, 281, 294, 281, 61, 347, 348,
+        54, 40, 286, 287, 281, 281, 281, 294,
+        281, 347, 347, 54, 40, 286, 287, 281,
+        281, 281, 294, 281, 349, 58, 330, 350,
+        281, 40, 286, 287, 281, 281, 281, 294,
+        281, 58, 330, 350, 281, 40, 286, 287,
+        281, 281, 281, 294, 281, 330, 351, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        58, 281, 330, 330, 281, 40, 286, 287,
+        281, 281, 281, 294, 281, 41, 42, 281,
+        281, 58, 329, 281, 40, 286, 287, 281,
+        281, 281, 294, 281, 41, 281, 323, 328,
+        328, 45, 40, 286, 287, 281, 281, 281,
+        326, 281, 322, 323, 328, 328, 45, 40,
+        286, 287, 281, 281, 281, 326, 281, 281,
+        289, 281, 322, 323, 324, 328, 45, 40,
+        286, 287, 281, 281, 69, 326, 281, 281,
+        289, 281, 320, 281, 352, 281, 339, 339,
+        45, 40, 286, 287, 281, 281, 281, 294,
+        281, 320, 281, 320, 281, 281, 281, 330,
+        330, 281, 40, 286, 287, 281, 281, 281,
+        294, 281, 320, 281, 320, 281, 281, 281,
+        330, 353, 281, 40, 286, 287, 281, 281,
+        281, 294, 281, 320, 281, 320, 281, 352,
+        281, 330, 330, 281, 40, 286, 287, 281,
+        281, 281, 294, 281, 320, 281, 320, 42,
+        281, 281, 58, 321, 281, 40, 286, 287,
+        281, 281, 281, 294, 281, 320, 281, 313,
+        314, 319, 319, 45, 40, 286, 287, 281,
+        281, 281, 317, 281, 281, 289, 281, 313,
+        314, 315, 319, 45, 40, 286, 287, 281,
+        281, 71, 317, 281, 281, 289, 281, 311,
+        281, 354, 281, 339, 339, 45, 40, 286,
+        287, 281, 281, 281, 294, 281, 311, 281,
+        311, 281, 281, 281, 330, 330, 281, 40,
+        286, 287, 281, 281, 281, 294, 281, 311,
+        281, 311, 281, 281, 281, 330, 355, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        311, 281, 311, 281, 354, 281, 330, 330,
+        281, 40, 286, 287, 281, 281, 281, 294,
+        281, 311, 281, 311, 42, 281, 281, 58,
+        312, 281, 40, 286, 287, 281, 281, 281,
+        294, 281, 311, 281, 304, 305, 310, 310,
+        45, 40, 286, 287, 281, 281, 281, 308,
+        281, 281, 289, 281, 304, 305, 306, 310,
+        45, 40, 286, 287, 281, 281, 73, 308,
+        281, 281, 289, 281, 302, 281, 356, 281,
+        339, 339, 45, 40, 286, 287, 281, 281,
+        281, 294, 281, 302, 281, 302, 281, 281,
+        281, 330, 330, 281, 40, 286, 287, 281,
+        281, 281, 294, 281, 302, 281, 302, 281,
+        281, 281, 330, 357, 281, 40, 286, 287,
+        281, 281, 281, 294, 281, 302, 281, 302,
+        281, 356, 281, 330, 330, 281, 40, 286,
+        287, 281, 281, 281, 294, 281, 302, 281,
+        302, 42, 281, 281, 58, 303, 281, 40,
+        286, 287, 281, 281, 281, 294, 281, 302,
+        281, 295, 296, 301, 301, 45, 40, 286,
+        287, 281, 281, 281, 299, 281, 281, 289,
+        281, 295, 296, 297, 301, 45, 40, 286,
+        287, 281, 281, 75, 299, 281, 281, 289,
+        281, 292, 281, 358, 281, 339, 339, 45,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        292, 281, 292, 281, 281, 281, 330, 330,
+        281, 40, 286, 287, 281, 281, 281, 294,
+        281, 292, 281, 292, 281, 281, 281, 330,
+        359, 281, 40, 286, 287, 281, 281, 281,
+        294, 281, 292, 281, 292, 281, 358, 281,
+        330, 330, 281, 40, 286, 287, 281, 281,
+        281, 294, 281, 292, 281, 76, 44, 44,
+        45, 40, 281, 281, 281, 281, 281, 76,
+        281, 292, 42, 281, 281, 58, 293, 281,
+        40, 286, 287, 281, 281, 281, 294, 281,
+        292, 281, 282, 283, 291, 285, 45, 40,
+        286, 287, 281, 281, 281, 288, 281, 281,
+        289, 281, 361, 191, 362, 362, 84, 79,
+        194, 195, 360, 360, 360, 197, 360, 360,
+        200, 360, 191, 362, 362, 84, 79, 194,
+        195, 360, 360, 360, 197, 360, 360, 200,
+        360, 363, 360, 360, 360, 98, 364, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        363, 360, 366, 367, 368, 369, 84, 79,
+        194, 195, 360, 360, 115, 370, 360, 360,
+        200, 360, 371, 367, 372, 372, 84, 79,
+        194, 195, 360, 360, 360, 370, 360, 360,
+        200, 360, 367, 372, 372, 84, 79, 194,
+        195, 360, 360, 360, 370, 360, 360, 200,
+        360, 373, 360, 360, 360, 98, 374, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        373, 360, 375, 376, 377, 378, 84, 79,
+        194, 195, 360, 360, 113, 379, 360, 360,
+        200, 360, 380, 376, 381, 381, 84, 79,
+        194, 195, 360, 360, 360, 379, 360, 360,
+        200, 360, 376, 381, 381, 84, 79, 194,
+        195, 360, 360, 360, 379, 360, 360, 200,
+        360, 382, 360, 360, 360, 98, 383, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        382, 360, 384, 385, 386, 387, 84, 79,
+        194, 195, 360, 360, 111, 388, 360, 360,
+        200, 360, 389, 385, 390, 390, 84, 79,
+        194, 195, 360, 360, 360, 388, 360, 360,
+        200, 360, 385, 390, 390, 84, 79, 194,
+        195, 360, 360, 360, 388, 360, 360, 200,
+        360, 391, 360, 360, 360, 98, 392, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        391, 360, 393, 394, 395, 396, 84, 79,
+        194, 195, 360, 360, 109, 397, 360, 360,
+        200, 360, 398, 394, 399, 399, 84, 79,
+        194, 195, 360, 360, 360, 397, 360, 360,
+        200, 360, 394, 399, 399, 84, 79, 194,
+        195, 360, 360, 360, 397, 360, 360, 200,
+        360, 98, 400, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 401, 401, 360, 79,
+        194, 195, 360, 360, 360, 365, 360, 402,
+        360, 360, 403, 194, 195, 360, 194, 195,
+        360, 404, 360, 194, 405, 360, 194, 406,
+        360, 194, 360, 402, 360, 360, 360, 194,
+        195, 360, 407, 360, 408, 409, 360, 79,
+        194, 195, 360, 360, 82, 360, 81, 360,
+        401, 401, 360, 79, 194, 195, 360, 401,
+        401, 360, 79, 194, 195, 360, 407, 360,
+        401, 401, 360, 79, 194, 195, 360, 407,
+        360, 408, 401, 360, 79, 194, 195, 360,
+        360, 82, 360, 98, 360, 410, 410, 84,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        411, 107, 412, 413, 88, 79, 194, 195,
+        360, 360, 360, 365, 360, 107, 412, 413,
+        88, 79, 194, 195, 360, 360, 360, 365,
+        360, 412, 412, 88, 79, 194, 195, 360,
+        360, 360, 365, 360, 414, 104, 415, 416,
+        91, 79, 194, 195, 360, 360, 360, 365,
+        360, 104, 415, 416, 91, 79, 194, 195,
+        360, 360, 360, 365, 360, 415, 415, 91,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        417, 101, 418, 419, 94, 79, 194, 195,
+        360, 360, 360, 365, 360, 101, 418, 419,
+        94, 79, 194, 195, 360, 360, 360, 365,
+        360, 418, 418, 94, 79, 194, 195, 360,
+        360, 360, 365, 360, 420, 98, 401, 421,
+        360, 79, 194, 195, 360, 360, 360, 365,
+        360, 98, 401, 421, 360, 79, 194, 195,
+        360, 360, 360, 365, 360, 401, 422, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        98, 360, 401, 401, 360, 79, 194, 195,
+        360, 360, 360, 365, 360, 80, 81, 360,
+        360, 98, 400, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 80, 360, 394, 399,
+        399, 84, 79, 194, 195, 360, 360, 360,
+        397, 360, 393, 394, 399, 399, 84, 79,
+        194, 195, 360, 360, 360, 397, 360, 360,
+        200, 360, 393, 394, 395, 399, 84, 79,
+        194, 195, 360, 360, 109, 397, 360, 360,
+        200, 360, 391, 360, 423, 360, 410, 410,
+        84, 79, 194, 195, 360, 360, 360, 365,
+        360, 391, 360, 391, 360, 360, 360, 401,
+        401, 360, 79, 194, 195, 360, 360, 360,
+        365, 360, 391, 360, 391, 360, 360, 360,
+        401, 424, 360, 79, 194, 195, 360, 360,
+        360, 365, 360, 391, 360, 391, 360, 423,
+        360, 401, 401, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 391, 360, 391, 81,
+        360, 360, 98, 392, 360, 79, 194, 195,
+        360, 360, 360, 365, 360, 391, 360, 384,
+        385, 390, 390, 84, 79, 194, 195, 360,
+        360, 360, 388, 360, 360, 200, 360, 384,
+        385, 386, 390, 84, 79, 194, 195, 360,
+        360, 111, 388, 360, 360, 200, 360, 382,
+        360, 425, 360, 410, 410, 84, 79, 194,
+        195, 360, 360, 360, 365, 360, 382, 360,
+        382, 360, 360, 360, 401, 401, 360, 79,
+        194, 195, 360, 360, 360, 365, 360, 382,
+        360, 382, 360, 360, 360, 401, 426, 360,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        382, 360, 382, 360, 425, 360, 401, 401,
+        360, 79, 194, 195, 360, 360, 360, 365,
+        360, 382, 360, 382, 81, 360, 360, 98,
+        383, 360, 79, 194, 195, 360, 360, 360,
+        365, 360, 382, 360, 375, 376, 381, 381,
+        84, 79, 194, 195, 360, 360, 360, 379,
+        360, 360, 200, 360, 375, 376, 377, 381,
+        84, 79, 194, 195, 360, 360, 113, 379,
+        360, 360, 200, 360, 373, 360, 427, 360,
+        410, 410, 84, 79, 194, 195, 360, 360,
+        360, 365, 360, 373, 360, 373, 360, 360,
+        360, 401, 401, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 373, 360, 373, 360,
+        360, 360, 401, 428, 360, 79, 194, 195,
+        360, 360, 360, 365, 360, 373, 360, 373,
+        360, 427, 360, 401, 401, 360, 79, 194,
+        195, 360, 360, 360, 365, 360, 373, 360,
+        373, 81, 360, 360, 98, 374, 360, 79,
+        194, 195, 360, 360, 360, 365, 360, 373,
+        360, 366, 367, 372, 372, 84, 79, 194,
+        195, 360, 360, 360, 370, 360, 360, 200,
+        360, 366, 367, 368, 372, 84, 79, 194,
+        195, 360, 360, 115, 370, 360, 360, 200,
+        360, 363, 360, 429, 360, 410, 410, 84,
+        79, 194, 195, 360, 360, 360, 365, 360,
+        363, 360, 363, 360, 360, 360, 401, 401,
+        360, 79, 194, 195, 360, 360, 360, 365,
+        360, 363, 360, 363, 360, 360, 360, 401,
+        430, 360, 79, 194, 195, 360, 360, 360,
+        365, 360, 363, 360, 363, 360, 429, 360,
+        401, 401, 360, 79, 194, 195, 360, 360,
+        360, 365, 360, 363, 360, 363, 81, 360,
+        360, 98, 364, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 363, 360, 116, 83,
+        83, 84, 79, 431, 431, 431, 431, 156,
+        116, 431, 190, 191, 362, 362, 84, 79,
+        194, 195, 360, 360, 360, 197, 360, 360,
+        200, 360, 116, 83, 83, 84, 79, 431,
+        431, 431, 431, 431, 116, 431, 433, 434,
+        435, 436, 123, 118, 437, 438, 432, 432,
+        155, 439, 432, 432, 440, 432, 441, 434,
+        436, 436, 123, 118, 437, 438, 432, 432,
+        432, 439, 432, 432, 440, 432, 434, 436,
+        436, 123, 118, 437, 438, 432, 432, 432,
+        439, 432, 432, 440, 432, 442, 432, 432,
+        432, 136, 443, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 442, 432, 445, 446,
+        447, 448, 123, 118, 437, 438, 432, 432,
+        153, 449, 432, 432, 440, 432, 450, 446,
+        451, 451, 123, 118, 437, 438, 432, 432,
+        432, 449, 432, 432, 440, 432, 446, 451,
+        451, 123, 118, 437, 438, 432, 432, 432,
+        449, 432, 432, 440, 432, 452, 432, 432,
+        432, 136, 453, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 452, 432, 454, 455,
+        456, 457, 123, 118, 437, 438, 432, 432,
+        151, 458, 432, 432, 440, 432, 459, 455,
+        460, 460, 123, 118, 437, 438, 432, 432,
+        432, 458, 432, 432, 440, 432, 455, 460,
+        460, 123, 118, 437, 438, 432, 432, 432,
+        458, 432, 432, 440, 432, 461, 432, 432,
+        432, 136, 462, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 461, 432, 463, 464,
+        465, 466, 123, 118, 437, 438, 432, 432,
+        149, 467, 432, 432, 440, 432, 468, 464,
+        469, 469, 123, 118, 437, 438, 432, 432,
+        432, 467, 432, 432, 440, 432, 464, 469,
+        469, 123, 118, 437, 438, 432, 432, 432,
+        467, 432, 432, 440, 432, 470, 432, 432,
+        432, 136, 471, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 470, 432, 472, 473,
+        474, 475, 123, 118, 437, 438, 432, 432,
+        147, 476, 432, 432, 440, 432, 477, 473,
+        478, 478, 123, 118, 437, 438, 432, 432,
+        432, 476, 432, 432, 440, 432, 473, 478,
+        478, 123, 118, 437, 438, 432, 432, 432,
+        476, 432, 432, 440, 432, 136, 479, 432,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        480, 480, 432, 118, 437, 438, 432, 432,
+        432, 444, 432, 481, 432, 432, 482, 437,
+        438, 432, 437, 438, 432, 483, 432, 437,
+        484, 432, 437, 485, 432, 437, 432, 481,
+        432, 432, 432, 437, 438, 432, 486, 432,
+        487, 488, 432, 118, 437, 438, 432, 432,
+        121, 432, 120, 432, 480, 480, 432, 118,
+        437, 438, 432, 480, 480, 432, 118, 437,
+        438, 432, 486, 432, 480, 480, 432, 118,
+        437, 438, 432, 486, 432, 487, 480, 432,
+        118, 437, 438, 432, 432, 121, 432, 136,
+        432, 489, 489, 123, 118, 437, 438, 432,
+        432, 432, 444, 432, 490, 145, 491, 492,
+        126, 118, 437, 438, 432, 432, 432, 444,
+        432, 145, 491, 492, 126, 118, 437, 438,
+        432, 432, 432, 444, 432, 491, 491, 126,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        493, 142, 494, 495, 129, 118, 437, 438,
+        432, 432, 432, 444, 432, 142, 494, 495,
+        129, 118, 437, 438, 432, 432, 432, 444,
+        432, 494, 494, 129, 118, 437, 438, 432,
+        432, 432, 444, 432, 496, 139, 497, 498,
+        132, 118, 437, 438, 432, 432, 432, 444,
+        432, 139, 497, 498, 132, 118, 437, 438,
+        432, 432, 432, 444, 432, 497, 497, 132,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        499, 136, 480, 500, 432, 118, 437, 438,
+        432, 432, 432, 444, 432, 136, 480, 500,
+        432, 118, 437, 438, 432, 432, 432, 444,
+        432, 480, 501, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 136, 432, 480, 480,
+        432, 118, 437, 438, 432, 432, 432, 444,
+        432, 119, 120, 432, 432, 136, 479, 432,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        119, 432, 473, 478, 478, 123, 118, 437,
+        438, 432, 432, 432, 476, 432, 472, 473,
+        478, 478, 123, 118, 437, 438, 432, 432,
+        432, 476, 432, 432, 440, 432, 472, 473,
+        474, 478, 123, 118, 437, 438, 432, 432,
+        147, 476, 432, 432, 440, 432, 470, 432,
+        502, 432, 489, 489, 123, 118, 437, 438,
+        432, 432, 432, 444, 432, 470, 432, 470,
+        432, 432, 432, 480, 480, 432, 118, 437,
+        438, 432, 432, 432, 444, 432, 470, 432,
+        470, 432, 432, 432, 480, 503, 432, 118,
+        437, 438, 432, 432, 432, 444, 432, 470,
+        432, 470, 432, 502, 432, 480, 480, 432,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        470, 432, 470, 120, 432, 432, 136, 471,
+        432, 118, 437, 438, 432, 432, 432, 444,
+        432, 470, 432, 463, 464, 469, 469, 123,
+        118, 437, 438, 432, 432, 432, 467, 432,
+        432, 440, 432, 463, 464, 465, 469, 123,
+        118, 437, 438, 432, 432, 149, 467, 432,
+        432, 440, 432, 461, 432, 504, 432, 489,
+        489, 123, 118, 437, 438, 432, 432, 432,
+        444, 432, 461, 432, 461, 432, 432, 432,
+        480, 480, 432, 118, 437, 438, 432, 432,
+        432, 444, 432, 461, 432, 461, 432, 432,
+        432, 480, 505, 432, 118, 437, 438, 432,
+        432, 432, 444, 432, 461, 432, 461, 432,
+        504, 432, 480, 480, 432, 118, 437, 438,
+        432, 432, 432, 444, 432, 461, 432, 461,
+        120, 432, 432, 136, 462, 432, 118, 437,
+        438, 432, 432, 432, 444, 432, 461, 432,
+        454, 455, 460, 460, 123, 118, 437, 438,
+        432, 432, 432, 458, 432, 432, 440, 432,
+        454, 455, 456, 460, 123, 118, 437, 438,
+        432, 432, 151, 458, 432, 432, 440, 432,
+        452, 432, 506, 432, 489, 489, 123, 118,
+        437, 438, 432, 432, 432, 444, 432, 452,
+        432, 452, 432, 432, 432, 480, 480, 432,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        452, 432, 452, 432, 432, 432, 480, 507,
+        432, 118, 437, 438, 432, 432, 432, 444,
+        432, 452, 432, 452, 432, 506, 432, 480,
+        480, 432, 118, 437, 438, 432, 432, 432,
+        444, 432, 452, 432, 452, 120, 432, 432,
+        136, 453, 432, 118, 437, 438, 432, 432,
+        432, 444, 432, 452, 432, 445, 446, 451,
+        451, 123, 118, 437, 438, 432, 432, 432,
+        449, 432, 432, 440, 432, 445, 446, 447,
+        451, 123, 118, 437, 438, 432, 432, 153,
+        449, 432, 432, 440, 432, 442, 432, 508,
+        432, 489, 489, 123, 118, 437, 438, 432,
+        432, 432, 444, 432, 442, 432, 442, 432,
+        432, 432, 480, 480, 432, 118, 437, 438,
+        432, 432, 432, 444, 432, 442, 432, 442,
+        432, 432, 432, 480, 509, 432, 118, 437,
+        438, 432, 432, 432, 444, 432, 442, 432,
+        442, 432, 508, 432, 480, 480, 432, 118,
+        437, 438, 432, 432, 432, 444, 432, 442,
+        432, 442, 120, 432, 432, 136, 443, 432,
+        118, 437, 438, 432, 432, 432, 444, 432,
+        442, 432, 433, 434, 436, 436, 123, 118,
+        437, 438, 432, 432, 432, 439, 432, 432,
+        440, 432, 188, 189, 190, 191, 510, 362,
+        84, 79, 194, 195, 196, 196, 156, 197,
+        360, 188, 200, 360, 203, 511, 205, 206,
+        6, 1, 207, 208, 202, 202, 38, 209,
+        202, 202, 210, 202, 213, 189, 190, 191,
+        512, 513, 84, 157, 514, 515, 202, 196,
+        156, 516, 202, 213, 200, 202, 116, 517,
+        517, 84, 157, 207, 208, 202, 202, 156,
+        518, 202, 519, 202, 202, 520, 514, 515,
+        202, 514, 515, 202, 254, 202, 514, 521,
+        202, 514, 522, 202, 514, 202, 519, 202,
+        202, 202, 514, 515, 202, 523, 3, 360,
+        360, 401, 430, 360, 79, 194, 195, 360,
+        360, 360, 365, 360, 523, 360, 524, 367,
+        525, 526, 84, 157, 514, 515, 202, 202,
+        158, 370, 202, 202, 200, 202, 527, 367,
+        528, 528, 84, 157, 514, 515, 202, 202,
+        202, 370, 202, 202, 200, 202, 367, 528,
+        528, 84, 157, 514, 515, 202, 202, 202,
+        370, 202, 202, 200, 202, 524, 367, 528,
+        528, 84, 157, 514, 515, 202, 202, 202,
+        370, 202, 202, 200, 202, 524, 367, 525,
+        528, 84, 157, 514, 515, 202, 202, 158,
+        370, 202, 202, 200, 202, 213, 202, 279,
+        116, 529, 529, 160, 157, 207, 208, 202,
+        202, 202, 518, 202, 213, 202, 530, 184,
+        531, 532, 162, 157, 514, 515, 202, 202,
+        202, 533, 202, 184, 531, 532, 162, 157,
+        514, 515, 202, 202, 202, 533, 202, 531,
+        531, 162, 157, 514, 515, 202, 202, 202,
+        533, 202, 534, 181, 535, 536, 165, 157,
+        514, 515, 202, 202, 202, 533, 202, 181,
+        535, 536, 165, 157, 514, 515, 202, 202,
+        202, 533, 202, 535, 535, 165, 157, 514,
+        515, 202, 202, 202, 533, 202, 537, 178,
+        538, 539, 168, 157, 514, 515, 202, 202,
+        202, 533, 202, 178, 538, 539, 168, 157,
+        514, 515, 202, 202, 202, 533, 202, 538,
+        538, 168, 157, 514, 515, 202, 202, 202,
+        533, 202, 540, 175, 541, 542, 202, 157,
+        514, 515, 202, 202, 202, 533, 202, 175,
+        541, 542, 202, 157, 514, 515, 202, 202,
+        202, 533, 202, 541, 541, 202, 157, 514,
+        515, 202, 202, 202, 533, 202, 543, 202,
+        544, 545, 202, 157, 514, 515, 202, 202,
+        172, 202, 171, 202, 541, 541, 202, 157,
+        514, 515, 202, 541, 541, 202, 157, 514,
+        515, 202, 543, 202, 541, 541, 202, 157,
+        514, 515, 202, 543, 202, 544, 541, 202,
+        157, 514, 515, 202, 202, 172, 202, 523,
+        171, 360, 360, 98, 364, 360, 79, 194,
+        195, 360, 360, 360, 365, 360, 523, 360,
+        547, 546, 548, 548, 546, 186, 549, 550,
+        546, 548, 548, 546, 186, 549, 550, 546,
+        551, 546, 546, 552, 549, 550, 546, 549,
+        550, 546, 553, 546, 549, 554, 546, 549,
+        555, 546, 549, 546, 551, 546, 546, 546,
+        549, 550, 546, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
         178, 200, 207, 209, 210, 4, 213, 5,
         7, 216, 8, 10, 219, 11, 13, 222,
         14, 16, 17, 199, 19, 20, 221, 22,
-        23, 218, 25, 26, 215, 224, 229, 233,
-        236, 240, 243, 247, 250, 254, 257, 178,
-        280, 287, 289, 290, 41, 293, 42, 44,
-        296, 45, 47, 299, 48, 50, 302, 51,
-        53, 54, 279, 56, 57, 301, 59, 60,
-        298, 62, 63, 295, 304, 309, 313, 316,
-        320, 323, 327, 330, 334, 338, 178, 359,
-        366, 368, 369, 78, 372, 178, 79, 81,
-        375, 82, 84, 378, 85, 87, 381, 88,
-        90, 91, 358, 93, 94, 380, 96, 97,
-        377, 99, 100, 374, 383, 388, 392, 395,
-        399, 402, 406, 409, 413, 178, 440, 447,
-        449, 450, 114, 453, 115, 117, 456, 118,
-        120, 459, 121, 123, 462, 124, 126, 127,
-        439, 129, 130, 461, 132, 133, 458, 135,
-        136, 455, 464, 469, 473, 476, 480, 483,
-        487, 490, 494, 497, 417, 502, 513, 152,
-        516, 154, 519, 155, 157, 522, 158, 160,
-        525, 161, 528, 530, 531, 166, 167, 527,
-        169, 170, 524, 172, 173, 521, 175, 176,
-        518, 178, 536, 178, 179, 259, 339, 341,
-        416, 418, 361, 362, 419, 415, 498, 499,
-        386, 534, 387, 178, 180, 182, 36, 258,
-        202, 203, 256, 227, 228, 181, 35, 183,
-        252, 1, 184, 186, 34, 251, 249, 185,
-        33, 187, 245, 188, 190, 32, 244, 242,
-        189, 31, 191, 238, 192, 194, 30, 237,
-        235, 193, 29, 195, 231, 196, 198, 28,
-        230, 226, 197, 27, 212, 0, 201, 206,
-        178, 204, 205, 208, 2, 211, 3, 214,
-        6, 24, 217, 9, 21, 220, 12, 18,
-        223, 15, 225, 232, 234, 239, 241, 246,
-        248, 253, 255, 178, 260, 262, 73, 336,
-        282, 283, 337, 307, 308, 261, 72, 263,
-        332, 38, 264, 266, 71, 331, 329, 265,
-        70, 267, 325, 268, 270, 69, 324, 322,
-        269, 68, 271, 318, 272, 274, 67, 317,
-        315, 273, 66, 275, 311, 276, 278, 65,
-        310, 306, 277, 64, 292, 37, 281, 286,
-        178, 284, 285, 288, 39, 291, 40, 294,
-        43, 61, 297, 46, 58, 300, 49, 55,
-        303, 52, 305, 312, 314, 319, 321, 326,
-        328, 333, 335, 178, 340, 109, 342, 411,
-        75, 343, 345, 108, 410, 408, 344, 107,
-        346, 404, 347, 349, 106, 403, 401, 348,
-        105, 350, 397, 351, 353, 104, 396, 394,
-        352, 103, 354, 390, 355, 357, 102, 389,
-        385, 356, 101, 371, 74, 360, 365, 178,
-        363, 364, 367, 76, 370, 77, 373, 80,
-        98, 376, 83, 95, 379, 86, 92, 382,
-        89, 384, 391, 393, 398, 400, 405, 407,
-        412, 414, 178, 178, 420, 422, 146, 145,
-        442, 443, 496, 467, 468, 421, 423, 492,
-        111, 424, 426, 144, 491, 489, 425, 143,
-        427, 485, 428, 430, 142, 484, 482, 429,
-        141, 431, 478, 432, 434, 140, 477, 475,
-        433, 139, 435, 471, 436, 438, 138, 470,
-        466, 437, 137, 452, 110, 441, 446, 178,
-        444, 445, 448, 112, 451, 113, 454, 116,
-        134, 457, 119, 131, 460, 122, 128, 463,
-        125, 465, 472, 474, 479, 481, 486, 488,
-        493, 495, 147, 500, 501, 515, 504, 505,
-        533, 148, 509, 503, 508, 506, 507, 510,
-        511, 150, 514, 512, 149, 151, 517, 153,
-        174, 163, 520, 156, 171, 523, 159, 168,
-        526, 162, 165, 529, 164, 532, 178, 535,
-        177, 538, 539, 537, 542, 178, 540, 541
+        23, 218, 25, 26, 215, 224, 228, 232,
+        235, 239, 242, 246, 249, 253, 256, 178,
+        279, 286, 288, 289, 41, 292, 42, 44,
+        295, 45, 47, 298, 48, 50, 301, 51,
+        53, 54, 278, 56, 57, 300, 59, 60,
+        297, 62, 63, 294, 303, 307, 311, 314,
+        318, 321, 325, 328, 332, 336, 178, 357,
+        364, 366, 367, 78, 370, 178, 79, 81,
+        373, 82, 84, 376, 85, 87, 379, 88,
+        90, 91, 356, 93, 94, 378, 96, 97,
+        375, 99, 100, 372, 381, 385, 389, 392,
+        396, 399, 403, 406, 410, 178, 437, 444,
+        446, 447, 114, 450, 115, 117, 453, 118,
+        120, 456, 121, 123, 459, 124, 126, 127,
+        436, 129, 130, 458, 132, 133, 455, 135,
+        136, 452, 461, 465, 469, 472, 476, 479,
+        483, 486, 490, 493, 414, 498, 509, 152,
+        512, 154, 515, 155, 157, 518, 158, 160,
+        521, 161, 524, 526, 527, 166, 167, 523,
+        169, 170, 520, 172, 173, 517, 175, 176,
+        514, 178, 532, 178, 179, 258, 337, 339,
+        413, 415, 359, 360, 416, 412, 494, 495,
+        384, 530, 178, 180, 182, 36, 257, 202,
+        203, 255, 227, 181, 35, 183, 251, 1,
+        184, 186, 34, 250, 248, 185, 33, 187,
+        244, 188, 190, 32, 243, 241, 189, 31,
+        191, 237, 192, 194, 30, 236, 234, 193,
+        29, 195, 230, 196, 198, 28, 229, 226,
+        197, 27, 212, 0, 201, 206, 178, 204,
+        205, 208, 2, 211, 3, 214, 6, 24,
+        217, 9, 21, 220, 12, 18, 223, 15,
+        225, 231, 233, 238, 240, 245, 247, 252,
+        254, 178, 259, 261, 73, 334, 281, 282,
+        335, 306, 260, 72, 262, 330, 38, 263,
+        265, 71, 329, 327, 264, 70, 266, 323,
+        267, 269, 69, 322, 320, 268, 68, 270,
+        316, 271, 273, 67, 315, 313, 272, 66,
+        274, 309, 275, 277, 65, 308, 305, 276,
+        64, 291, 37, 280, 285, 178, 283, 284,
+        287, 39, 290, 40, 293, 43, 61, 296,
+        46, 58, 299, 49, 55, 302, 52, 304,
+        310, 312, 317, 319, 324, 326, 331, 333,
+        178, 338, 109, 340, 408, 75, 341, 343,
+        108, 407, 405, 342, 107, 344, 401, 345,
+        347, 106, 400, 398, 346, 105, 348, 394,
+        349, 351, 104, 393, 391, 350, 103, 352,
+        387, 353, 355, 102, 386, 383, 354, 101,
+        369, 74, 358, 363, 178, 361, 362, 365,
+        76, 368, 77, 371, 80, 98, 374, 83,
+        95, 377, 86, 92, 380, 89, 382, 388,
+        390, 395, 397, 402, 404, 409, 411, 178,
+        178, 417, 419, 146, 145, 439, 440, 492,
+        464, 418, 420, 488, 111, 421, 423, 144,
+        487, 485, 422, 143, 424, 481, 425, 427,
+        142, 480, 478, 426, 141, 428, 474, 429,
+        431, 140, 473, 471, 430, 139, 432, 467,
+        433, 435, 138, 466, 463, 434, 137, 449,
+        110, 438, 443, 178, 441, 442, 445, 112,
+        448, 113, 451, 116, 134, 454, 119, 131,
+        457, 122, 128, 460, 125, 462, 468, 470,
+        475, 477, 482, 484, 489, 491, 147, 496,
+        497, 511, 500, 501, 529, 148, 505, 499,
+        504, 502, 503, 506, 507, 150, 510, 508,
+        149, 151, 513, 153, 174, 163, 516, 156,
+        171, 519, 159, 168, 522, 162, 165, 525,
+        164, 528, 178, 531, 177, 534, 535, 533,
+        538, 178, 536, 537
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
@@ -1285,51 +1087,51 @@ static const char _indic_syllable_machine_trans_actions[] = {
         0, 0, 2, 0, 0, 2, 0, 0,
         2, 9, 0, 12, 2, 2, 6, 2,
         13, 13, 0, 0, 2, 2, 6, 2,
-        6, 2, 6, 14, 2, 2, 0, 2,
-        0, 0, 2, 2, 2, 2, 0, 2,
-        2, 0, 2, 2, 0, 2, 2, 2,
-        0, 2, 2, 2, 2, 0, 2, 2,
-        2, 0, 2, 2, 2, 2, 0, 2,
-        2, 2, 0, 2, 2, 2, 2, 0,
-        2, 2, 2, 0, 2, 0, 0, 0,
-        15, 0, 0, 2, 0, 2, 0, 2,
-        0, 0, 2, 0, 0, 2, 0, 0,
-        2, 0, 2, 2, 2, 2, 2, 2,
-        2, 2, 2, 16, 2, 2, 0, 2,
-        0, 0, 2, 2, 2, 2, 0, 2,
-        2, 0, 2, 2, 0, 2, 2, 2,
-        0, 2, 2, 2, 2, 0, 2, 2,
-        2, 0, 2, 2, 2, 2, 0, 2,
-        2, 2, 0, 2, 2, 2, 2, 0,
-        2, 2, 2, 0, 2, 0, 0, 0,
-        17, 0, 0, 2, 0, 2, 0, 2,
-        0, 0, 2, 0, 0, 2, 0, 0,
-        2, 0, 2, 2, 2, 2, 2, 2,
-        2, 2, 2, 18, 6, 0, 6, 6,
-        0, 6, 2, 0, 6, 2, 6, 0,
-        6, 6, 6, 2, 0, 6, 2, 6,
-        0, 6, 6, 6, 2, 0, 6, 2,
-        6, 0, 6, 6, 6, 2, 0, 6,
-        2, 6, 0, 6, 0, 0, 0, 19,
-        0, 0, 2, 0, 2, 0, 2, 0,
-        0, 2, 0, 0, 2, 0, 0, 2,
-        0, 2, 2, 2, 2, 2, 2, 2,
-        2, 2, 20, 21, 2, 2, 0, 0,
-        0, 0, 2, 2, 2, 2, 2, 2,
-        0, 2, 2, 0, 2, 2, 2, 0,
+        6, 2, 14, 2, 2, 0, 2, 0,
+        0, 2, 2, 2, 0, 2, 2, 0,
+        2, 2, 0, 2, 2, 2, 0, 2,
+        2, 2, 2, 0, 2, 2, 2, 0,
         2, 2, 2, 2, 0, 2, 2, 2,
         0, 2, 2, 2, 2, 0, 2, 2,
-        2, 0, 2, 2, 2, 2, 0, 2,
-        2, 2, 0, 2, 0, 0, 0, 22,
-        0, 0, 2, 0, 2, 0, 2, 0,
+        2, 0, 2, 0, 0, 0, 15, 0,
+        0, 2, 0, 2, 0, 2, 0, 0,
+        2, 0, 0, 2, 0, 0, 2, 0,
+        2, 2, 2, 2, 2, 2, 2, 2,
+        2, 16, 2, 2, 0, 2, 0, 0,
+        2, 2, 2, 0, 2, 2, 0, 2,
+        2, 0, 2, 2, 2, 0, 2, 2,
+        2, 2, 0, 2, 2, 2, 0, 2,
+        2, 2, 2, 0, 2, 2, 2, 0,
+        2, 2, 2, 2, 0, 2, 2, 2,
+        0, 2, 0, 0, 0, 17, 0, 0,
+        2, 0, 2, 0, 2, 0, 0, 2,
+        0, 0, 2, 0, 0, 2, 0, 2,
+        2, 2, 2, 2, 2, 2, 2, 2,
+        18, 6, 0, 6, 6, 0, 6, 2,
+        0, 6, 2, 6, 0, 6, 6, 6,
+        2, 0, 6, 2, 6, 0, 6, 6,
+        6, 2, 0, 6, 2, 6, 0, 6,
+        6, 6, 2, 0, 6, 2, 6, 0,
+        6, 0, 0, 0, 19, 0, 0, 2,
+        0, 2, 0, 2, 0, 0, 2, 0,
+        0, 2, 0, 0, 2, 0, 2, 2,
+        2, 2, 2, 2, 2, 2, 2, 20,
+        21, 2, 2, 0, 0, 0, 0, 2,
+        2, 2, 2, 2, 0, 2, 2, 0,
+        2, 2, 2, 0, 2, 2, 2, 2,
+        0, 2, 2, 2, 0, 2, 2, 2,
+        2, 0, 2, 2, 2, 0, 2, 2,
+        2, 2, 0, 2, 2, 2, 0, 2,
+        0, 0, 0, 22, 0, 0, 2, 0,
+        2, 0, 2, 0, 0, 2, 0, 0,
+        2, 0, 0, 2, 0, 2, 2, 2,
+        2, 2, 2, 2, 2, 2, 0, 0,
+        8, 2, 0, 0, 2, 0, 2, 0,
+        0, 0, 0, 8, 8, 0, 8, 8,
+        0, 0, 2, 0, 0, 0, 2, 0,
         0, 2, 0, 0, 2, 0, 0, 2,
-        0, 2, 2, 2, 2, 2, 2, 2,
-        2, 2, 0, 0, 8, 2, 0, 0,
-        2, 0, 2, 0, 0, 0, 0, 8,
-        8, 0, 8, 8, 0, 0, 2, 0,
-        0, 0, 2, 0, 0, 2, 0, 0,
-        2, 0, 0, 2, 0, 2, 23, 2,
-        0, 0, 0, 0, 0, 24, 0, 0
+        0, 2, 23, 2, 0, 0, 0, 0,
+        0, 24, 0, 0
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1400,7 +1202,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0
+        0, 0, 0
 };
 
 static const char _indic_syllable_machine_from_state_actions[] = {
@@ -1471,7 +1273,7 @@ static const char _indic_syllable_machine_from_state_actions[] = {
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0
+        0, 0, 0
 };
 
 static const short _indic_syllable_machine_eof_trans[] = {
@@ -1497,52 +1299,52 @@ static const short _indic_syllable_machine_eof_trans[] = {
         1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1,
-        1, 186, 0, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 284, 284, 284, 284, 284,
-        284, 284, 284, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        364, 364, 364, 364, 364, 364, 364, 364,
-        435, 364, 435, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 436, 436, 436, 436, 436, 436,
-        436, 436, 364, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 364, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 204, 204, 204,
-        204, 204, 204, 204, 204, 364, 551, 551,
-        551, 551, 551, 551, 551, 551, 551
+        1, 186, 0, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 282, 282, 282, 282, 282, 282, 282,
+        282, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 361, 361, 361,
+        361, 361, 361, 361, 361, 432, 361, 432,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 433, 433,
+        433, 433, 433, 433, 433, 433, 361, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 361, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 203, 203, 203, 203, 203, 203, 203,
+        203, 361, 547, 547, 547, 547, 547, 547,
+        547, 547, 547
 };
 
 static const int indic_syllable_machine_start = 178;
@@ -1556,7 +1358,7 @@ static const int indic_syllable_machine_en_main = 178;
 
 
 
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -1576,7 +1378,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 1580 "hb-ot-shape-complex-indic-machine.hh"
+#line 1382 "hb-ot-shape-complex-indic-machine.hh"
         {
         cs = indic_syllable_machine_start;
         ts = 0;
@@ -1584,7 +1386,7 @@ find_syllables (hb_buffer_t *buffer)
         act = 0;
         }
 
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 117 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -1593,7 +1395,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
 
-#line 1597 "hb-ot-shape-complex-indic-machine.hh"
+#line 1399 "hb-ot-shape-complex-indic-machine.hh"
         {
         int _slen;
         int _trans;
@@ -1607,7 +1409,7 @@ _resume:
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 1611 "hb-ot-shape-complex-indic-machine.hh"
+#line 1413 "hb-ot-shape-complex-indic-machine.hh"
         }
 
         _keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1630,71 +1432,71 @@ _eof_trans:
         {te = p+1;}
         break;
         case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (consonant_syllable); }}
         break;
         case 17:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (vowel_syllable); }}
         break;
         case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (standalone_cluster); }}
         break;
         case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (symbol_cluster); }}
         break;
         case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (broken_cluster); }}
         break;
         case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
         {te = p+1;{ found_syllable (non_indic_cluster); }}
         break;
         case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (consonant_syllable); }}
         break;
         case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (vowel_syllable); }}
         break;
         case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (standalone_cluster); }}
         break;
         case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (symbol_cluster); }}
         break;
         case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (broken_cluster); }}
         break;
         case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
         {te = p;p--;{ found_syllable (non_indic_cluster); }}
         break;
         case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
         {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
         break;
         case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
         {{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
         break;
         case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
         {{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
         break;
         case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
         {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
         break;
         case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
         {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
         break;
         case 5:
@@ -1715,22 +1517,22 @@ _eof_trans:
         case 8:
 #line 1 "NONE"
         {te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
         {act = 1;}
         break;
         case 6:
 #line 1 "NONE"
         {te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
         {act = 5;}
         break;
         case 13:
 #line 1 "NONE"
         {te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
         {act = 6;}
         break;
-#line 1734 "hb-ot-shape-complex-indic-machine.hh"
+#line 1536 "hb-ot-shape-complex-indic-machine.hh"
         }
 
 _again:
@@ -1739,7 +1541,7 @@ _again:
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 1743 "hb-ot-shape-complex-indic-machine.hh"
+#line 1545 "hb-ot-shape-complex-indic-machine.hh"
         }
 
         if ( ++p != pe )
@@ -1755,7 +1557,7 @@ _again:
 
         }
 
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 126 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
index a999098dde0..4fdc2f80ccf 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
@@ -60,11 +60,10 @@ enum indic_category_t {
   OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
   OT_Ra = 16,
   OT_CM = 17,  /* Consonant-Medial. */
-  OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
-  OT_CM2 = 31 /* Consonant-Medial, second slot. */
+  OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
 };
 
-#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2))
+#define MEDIAL_FLAGS (FLAG (OT_CM))
 
 /* Note:
  *
@@ -109,27 +108,31 @@ enum indic_syllabic_category_t {
 
   INDIC_SYLLABIC_CATEGORY_AVAGRAHA                      = OT_Symbol,
   INDIC_SYLLABIC_CATEGORY_BINDU                         = OT_SM,
-  INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER         = OT_PLACEHOLDER, /* TODO */
+  INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER         = OT_PLACEHOLDER, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK             = OT_A,
   INDIC_SYLLABIC_CATEGORY_CONSONANT                     = OT_C,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD                = OT_C,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL               = OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER         = OT_C,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER              = OT_M, /* U+17CD only. */
   INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL              = OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER         = OT_PLACEHOLDER,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA     = OT_Repha,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED            = OT_X, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED           = OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA    = OT_N,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER        = OT_Repha, /* TODO */
   INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK               = OT_SM,
-  INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER             = OT_H, /* TODO */
+  INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER             = OT_Coeng,
   INDIC_SYLLABIC_CATEGORY_JOINER                        = OT_ZWJ,
   INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER              = OT_X,
   INDIC_SYLLABIC_CATEGORY_NON_JOINER                    = OT_ZWNJ,
   INDIC_SYLLABIC_CATEGORY_NUKTA                         = OT_N,
   INDIC_SYLLABIC_CATEGORY_NUMBER                        = OT_PLACEHOLDER,
-  INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER                 = OT_PLACEHOLDER, /* TODO */
-  INDIC_SYLLABIC_CATEGORY_PURE_KILLER                   = OT_H, /* TODO */
+  INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER                 = OT_PLACEHOLDER, /* Don't care. */
+  INDIC_SYLLABIC_CATEGORY_PURE_KILLER                   = OT_M, /* Is like a vowel matra. */
   INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER              = OT_RS,
+  INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER             = OT_M, /* Misc Khmer signs. */
   INDIC_SYLLABIC_CATEGORY_TONE_LETTER                   = OT_X,
   INDIC_SYLLABIC_CATEGORY_TONE_MARK                     = OT_N,
   INDIC_SYLLABIC_CATEGORY_VIRAMA                        = OT_H,
@@ -162,17 +165,23 @@ enum indic_matra_category_t {
 };
 
 #define INDIC_COMBINE_CATEGORIES(S,M) \
-  (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \
-                            ( \
-                             S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
-                             S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
-                             S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
-                             S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
-                             S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
-                             S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
-                             false)) + \
-   ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
-   ((M << 8) | S))
+  ( \
+    ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+    ( S | \
+     ( \
+      ( \
+       S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
+       S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
+       S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
+       S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
+       S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
+       S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
+       false \
+       ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
+      ) << 8 \
+     ) \
+    ) \
+   )
 
 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
index 9e6fa3f89a7..b43e347054a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
@@ -2,67 +2,71 @@
 /*
  * The following table is generated by running:
  *
- *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
+ *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # IndicMatraCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # Blocks-7.0.0.txt
- * # Date: 2014-04-03, 23:23:00 GMT [RP, KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  */
 
 #include "hb-ot-shape-complex-indic-private.hh"
 
 
-#define ISC_A   INDIC_SYLLABIC_CATEGORY_AVAGRAHA                /*  13 chars; Avagraha */
-#define ISC_Bi  INDIC_SYLLABIC_CATEGORY_BINDU                   /*  59 chars; Bindu */
+#define ISC_A   INDIC_SYLLABIC_CATEGORY_AVAGRAHA                /*  15 chars; Avagraha */
+#define ISC_Bi  INDIC_SYLLABIC_CATEGORY_BINDU                   /*  67 chars; Bindu */
 #define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER   /*  20 chars; Brahmi_Joining_Number */
-#define ISC_Ca  INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK       /*  30 chars; Cantillation_Mark */
-#define ISC_C   INDIC_SYLLABIC_CATEGORY_CONSONANT               /* 1744 chars; Consonant */
-#define ISC_CD  INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD          /*   7 chars; Consonant_Dead */
-#define ISC_CF  INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL         /*  61 chars; Consonant_Final */
+#define ISC_Ca  INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK       /*  53 chars; Cantillation_Mark */
+#define ISC_C   INDIC_SYLLABIC_CATEGORY_CONSONANT               /* 1907 chars; Consonant */
+#define ISC_CD  INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD          /*  10 chars; Consonant_Dead */
+#define ISC_CF  INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL         /*  62 chars; Consonant_Final */
 #define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER   /*   5 chars; Consonant_Head_Letter */
-#define ISC_CM  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL        /*  19 chars; Consonant_Medial */
-#define ISC_CP  INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER   /*  11 chars; Consonant_Placeholder */
+#define ISC_CK  INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER        /*   2 chars; Consonant_Killer */
+#define ISC_CM  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL        /*  22 chars; Consonant_Medial */
+#define ISC_CP  INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER   /*  16 chars; Consonant_Placeholder */
 #define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA       /*   1 chars; Consonant_Preceding_Repha */
-#define ISC_CS  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED     /*  61 chars; Consonant_Subjoined */
+#define ISC_CPrf        INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED      /*   2 chars; Consonant_Prefixed */
+#define ISC_CS  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED     /*  90 chars; Consonant_Subjoined */
 #define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA      /*   4 chars; Consonant_Succeeding_Repha */
+#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER  /*   4 chars; Consonant_With_Stacker */
 #define ISC_GM  INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK         /*   2 chars; Gemination_Mark */
 #define ISC_IS  INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER       /*   7 chars; Invisible_Stacker */
 #define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER                  /*   1 chars; Joiner */
 #define ISC_ML  INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER        /*   1 chars; Modifying_Letter */
 #define ISC_ZWNJ        INDIC_SYLLABIC_CATEGORY_NON_JOINER              /*   1 chars; Non_Joiner */
-#define ISC_N   INDIC_SYLLABIC_CATEGORY_NUKTA                   /*  18 chars; Nukta */
-#define ISC_Nd  INDIC_SYLLABIC_CATEGORY_NUMBER                  /* 408 chars; Number */
+#define ISC_N   INDIC_SYLLABIC_CATEGORY_NUKTA                   /*  24 chars; Nukta */
+#define ISC_Nd  INDIC_SYLLABIC_CATEGORY_NUMBER                  /* 459 chars; Number */
 #define ISC_NJ  INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER           /*   1 chars; Number_Joiner */
 #define ISC_x   INDIC_SYLLABIC_CATEGORY_OTHER                   /*   1 chars; Other */
-#define ISC_PK  INDIC_SYLLABIC_CATEGORY_PURE_KILLER             /*  15 chars; Pure_Killer */
-#define ISC_RS  INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER        /*   3 chars; Register_Shifter */
+#define ISC_PK  INDIC_SYLLABIC_CATEGORY_PURE_KILLER             /*  16 chars; Pure_Killer */
+#define ISC_RS  INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER        /*   2 chars; Register_Shifter */
+#define ISC_SM  INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER       /*  22 chars; Syllable_Modifier */
 #define ISC_TL  INDIC_SYLLABIC_CATEGORY_TONE_LETTER             /*   7 chars; Tone_Letter */
-#define ISC_TM  INDIC_SYLLABIC_CATEGORY_TONE_MARK               /*  62 chars; Tone_Mark */
-#define ISC_V   INDIC_SYLLABIC_CATEGORY_VIRAMA                  /*  22 chars; Virama */
-#define ISC_Vs  INDIC_SYLLABIC_CATEGORY_VISARGA                 /*  29 chars; Visarga */
+#define ISC_TM  INDIC_SYLLABIC_CATEGORY_TONE_MARK               /*  42 chars; Tone_Mark */
+#define ISC_V   INDIC_SYLLABIC_CATEGORY_VIRAMA                  /*  24 chars; Virama */
+#define ISC_Vs  INDIC_SYLLABIC_CATEGORY_VISARGA                 /*  31 chars; Visarga */
 #define ISC_Vo  INDIC_SYLLABIC_CATEGORY_VOWEL                   /*  30 chars; Vowel */
-#define ISC_M   INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT         /* 553 chars; Vowel_Dependent */
-#define ISC_VI  INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT       /* 395 chars; Vowel_Independent */
+#define ISC_M   INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT         /* 602 chars; Vowel_Dependent */
+#define ISC_VI  INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT       /* 431 chars; Vowel_Independent */
 
-#define IMC_B   INDIC_MATRA_CATEGORY_BOTTOM                     /* 142 chars; Bottom */
+#define IMC_B   INDIC_MATRA_CATEGORY_BOTTOM                     /* 300 chars; Bottom */
 #define IMC_BR  INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT           /*   2 chars; Bottom_And_Right */
 #define IMC_L   INDIC_MATRA_CATEGORY_LEFT                       /*  57 chars; Left */
 #define IMC_LR  INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT             /*  21 chars; Left_And_Right */
 #define IMC_x   INDIC_MATRA_CATEGORY_NOT_APPLICABLE             /*   1 chars; Not_Applicable */
-#define IMC_O   INDIC_MATRA_CATEGORY_OVERSTRUCK                 /*   2 chars; Overstruck */
-#define IMC_R   INDIC_MATRA_CATEGORY_RIGHT                      /* 163 chars; Right */
-#define IMC_T   INDIC_MATRA_CATEGORY_TOP                        /* 169 chars; Top */
+#define IMC_O   INDIC_MATRA_CATEGORY_OVERSTRUCK                 /*  10 chars; Overstruck */
+#define IMC_R   INDIC_MATRA_CATEGORY_RIGHT                      /* 258 chars; Right */
+#define IMC_T   INDIC_MATRA_CATEGORY_TOP                        /* 342 chars; Top */
 #define IMC_TB  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM             /*  10 chars; Top_And_Bottom */
 #define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT   /*   1 chars; Top_And_Bottom_And_Right */
 #define IMC_TL  INDIC_MATRA_CATEGORY_TOP_AND_LEFT               /*   6 chars; Top_And_Left */
 #define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT     /*   4 chars; Top_And_Left_And_Right */
 #define IMC_TR  INDIC_MATRA_CATEGORY_TOP_AND_RIGHT              /*  13 chars; Top_And_Right */
-#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT          /*  15 chars; Visual_Order_Left */
+#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT          /*  19 chars; Visual_Order_Left */
 
 #define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
 
@@ -79,29 +83,33 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0030 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0038 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x00d0u 24
+#define indic_offset_0x00b0u 24
 
 
   /* Latin-1 Supplement */
 
+  /* 00B0 */  _(x,x),  _(x,x), _(SM,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00B8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00C0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 00C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 00D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CP,x),
 
-#define indic_offset_0x0900u 32
+#define indic_offset_0x0900u 64
 
 
   /* Devanagari */
 
-  /* 0900 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0900 */ _(Bi,T), _(Bi,T), _(Bi,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0910 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0920 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0928 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0930 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0938 */  _(C,x),  _(C,x),  _(M,T),  _(M,R),  _(N,x),  _(A,x),  _(M,R),  _(M,L),
+  /* 0938 */  _(C,x),  _(C,x),  _(M,T),  _(M,R),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
   /* 0940 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),
   /* 0948 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(V,B),  _(M,L),  _(M,R),
-  /* 0950 */  _(x,x), _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(M,T),  _(M,B),  _(M,B),
+  /* 0950 */  _(x,x), _(Ca,T), _(Ca,B),  _(x,T),  _(x,T),  _(M,T),  _(M,B),  _(M,B),
   /* 0958 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0960 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0968 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@@ -110,14 +118,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Bengali */
 
-  /* 0980 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0980 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0990 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 09A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 09A8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 09B0 */  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),
-  /* 09B8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,L),
+  /* 09B8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
   /* 09C0 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(M,L),
   /* 09C8 */  _(M,L),  _(x,x),  _(x,x), _(M,LR), _(M,LR),  _(V,B), _(CD,x),  _(x,x),
   /* 09D0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
@@ -129,33 +137,33 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Gurmukhi */
 
-  /* 0A00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0A00 */  _(x,x), _(Bi,T), _(Bi,T), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0A08 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0A10 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0A18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0A28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0A30 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 0A38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(x,x),  _(M,R),  _(M,L),
+  /* 0A38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(x,x),  _(M,R),  _(M,L),
   /* 0A40 */  _(M,R),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),
   /* 0A48 */  _(M,T),  _(x,x),  _(x,x),  _(M,T),  _(M,T),  _(V,B),  _(x,x),  _(x,x),
   /* 0A50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0A58 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),
   /* 0A60 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 0A70 */ _(Bi,x), _(GM,T), _(CP,x), _(CP,x),  _(x,x), _(CM,x),  _(x,x),  _(x,x),
+  /* 0A70 */ _(Bi,T), _(GM,T), _(CP,x), _(CP,x),  _(x,x), _(CM,B),  _(x,x),  _(x,x),
   /* 0A78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Gujarati */
 
-  /* 0A80 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0A80 */  _(x,x), _(Bi,T), _(Bi,T), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x),
   /* 0A90 */ _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0A98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0AA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0AA8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0AB0 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0AB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,L),
+  /* 0AB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,L),
   /* 0AC0 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(x,x),  _(M,T),
   /* 0AC8 */  _(M,T), _(M,TR),  _(x,x),  _(M,R),  _(M,R),  _(V,B),  _(x,x),  _(x,x),
   /* 0AD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -163,18 +171,18 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0AE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0AF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0AF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0AF8 */  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Oriya */
 
-  /* 0B00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0B00 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0B10 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0B18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0B20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0B28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0B30 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0B38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,T),
+  /* 0B38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,T),
   /* 0B40 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(M,L),
   /* 0B48 */ _(M,TL),  _(x,x),  _(x,x), _(M,LR),_(M,TLR),  _(V,B),  _(x,x),  _(x,x),
   /* 0B50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T), _(M,TR),
@@ -186,7 +194,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Tamil */
 
-  /* 0B80 */  _(x,x),  _(x,x), _(Bi,x), _(ML,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0B80 */  _(x,x),  _(x,x), _(Bi,T), _(ML,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0B88 */ _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),
   /* 0B90 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(x,x),  _(x,x),
   /* 0B98 */  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
@@ -194,7 +202,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0BA8 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),
   /* 0BB0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0BB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),  _(M,R),
-  /* 0BC0 */  _(M,T),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(M,L),  _(M,L),
+  /* 0BC0 */  _(M,T),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(M,L),  _(M,L),
   /* 0BC8 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),  _(x,x),  _(x,x),
   /* 0BD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
   /* 0BD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -205,7 +213,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Telugu */
 
-  /* 0C00 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
   /* 0C10 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0C18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -216,7 +224,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0C40 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T),  _(M,T),
   /* 0C48 */ _(M,TB),  _(x,x),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
   /* 0C50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),  _(M,B),  _(x,x),
-  /* 0C58 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0C58 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0C60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0C70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -224,26 +232,26 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Kannada */
 
-  /* 0C80 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0C80 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
   /* 0C90 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0C98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0CA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0CA8 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0CB0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0CB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,T),
+  /* 0CB8 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,T),
   /* 0CC0 */ _(M,TR),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T), _(M,TR),
   /* 0CC8 */ _(M,TR),  _(x,x), _(M,TR), _(M,TR),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
   /* 0CD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),
   /* 0CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(x,x),
   /* 0CE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 0CF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0CF0 */  _(x,x),_(CWS,x),_(CWS,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0CF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Malayalam */
 
-  /* 0D00 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D00 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
   /* 0D10 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -253,8 +261,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0D38 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(A,x),  _(M,R),  _(M,R),
   /* 0D40 */  _(M,R),  _(M,R),  _(M,R),  _(M,B),  _(M,B),  _(x,x),  _(M,L),  _(M,L),
   /* 0D48 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),_(CPR,x),  _(x,x),
-  /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
-  /* 0D58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x),  _(M,R),
+  /* 0D58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0D60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0D68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0D70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -262,7 +270,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Sinhala */
 
-  /* 0D80 */  _(x,x),  _(x,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D80 */  _(x,x),  _(x,x), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),
   /* 0D98 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -278,7 +286,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0DE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0DF0 */  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1000u 1304
+#define indic_offset_0x1000u 1336
 
 
   /* Myanmar */
@@ -289,52 +297,24 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1018 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 1020 */  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 1028 */ _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,B),
-  /* 1030 */  _(M,B),  _(M,L),  _(M,T),  _(M,T),  _(M,T),  _(M,T), _(Bi,x), _(TM,x),
-  /* 1038 */ _(Vs,x), _(IS,x), _(PK,T), _(CM,x), _(CM,x), _(CM,x), _(CM,x),  _(C,x),
+  /* 1030 */  _(M,B),  _(M,L),  _(M,T),  _(M,T),  _(M,T),  _(M,T), _(Bi,T), _(TM,B),
+  /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B),  _(C,x),
   /* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 1048 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CP,x),  _(x,x),
   /* 1050 */  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),
-  /* 1058 */  _(M,B),  _(M,B),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CM,x), _(CM,x),
-  /* 1060 */ _(CM,x),  _(C,x),  _(M,R), _(TM,x), _(TM,x),  _(C,x),  _(C,x),  _(M,R),
-  /* 1068 */  _(M,R), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),  _(C,x),  _(C,x),
+  /* 1058 */  _(M,B),  _(M,B),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CM,B), _(CM,B),
+  /* 1060 */ _(CM,B),  _(C,x),  _(M,R), _(TM,R), _(TM,R),  _(C,x),  _(C,x),  _(M,R),
+  /* 1068 */  _(M,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R),  _(C,x),  _(C,x),
   /* 1070 */  _(C,x),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(C,x),  _(C,x),  _(C,x),
   /* 1078 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1080 */  _(C,x),  _(C,x), _(CM,x),  _(M,R),  _(M,L),  _(M,T),  _(M,T), _(TM,x),
-  /* 1088 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),  _(C,x), _(TM,x),
+  /* 1080 */  _(C,x),  _(C,x), _(CM,B),  _(M,R),  _(M,L),  _(M,T),  _(M,T), _(TM,R),
+  /* 1088 */ _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,B),  _(C,x), _(TM,R),
   /* 1090 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1098 */ _(Nd,x), _(Nd,x), _(TM,x), _(TM,x),  _(M,R),  _(M,T),  _(x,x),  _(x,x),
+  /* 1098 */ _(Nd,x), _(Nd,x), _(TM,R), _(TM,R),  _(M,R),  _(M,T),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1700u 1464
+#define indic_offset_0x1780u 1496
 
 
-  /* Tagalog */
-
-  /* 1700 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1708 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
-  /* 1710 */  _(C,x),  _(C,x),  _(M,T),  _(M,B), _(PK,B),  _(x,x),  _(x,x),  _(x,x),
-  /* 1718 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Hanunoo */
-
-  /* 1720 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1728 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1730 */  _(C,x),  _(C,x),  _(M,T),  _(M,B), _(PK,B),  _(x,x),  _(x,x),  _(x,x),
-  /* 1738 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Buhid */
-
-  /* 1740 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1748 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1750 */  _(C,x),  _(C,x),  _(M,T),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1758 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Tagbanwa */
-
-  /* 1760 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1768 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),
-  /* 1770 */  _(C,x),  _(x,x),  _(M,T),  _(M,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1778 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
   /* Khmer */
 
   /* 1780 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -345,515 +325,72 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 17A8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 17B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x),  _(M,R),  _(M,T),
   /* 17B8 */  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,B), _(M,TL),_(M,TLR),
-  /* 17C0 */ _(M,LR),  _(M,L),  _(M,L),  _(M,L), _(M,LR), _(M,LR), _(Bi,x), _(Vs,x),
-  /* 17C8 */  _(M,R), _(RS,T), _(RS,T), _(RS,T),_(CSR,T),  _(M,T),  _(M,T),  _(M,T),
-  /* 17D0 */  _(M,T), _(PK,T), _(IS,x),  _(M,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 17C0 */ _(M,LR),  _(M,L),  _(M,L),  _(M,L), _(M,LR), _(M,LR), _(Bi,T), _(Vs,R),
+  /* 17C8 */  _(M,R), _(RS,T), _(RS,T), _(SM,T),_(CSR,T), _(CK,T), _(SM,T), _(SM,T),
+  /* 17D0 */ _(SM,T), _(PK,T), _(IS,x), _(SM,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 17D8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x), _(SM,T),  _(x,x),  _(x,x),
   /* 17E0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 17E8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x1900u 1704
-
-
-  /* Limbu */
-
-  /* 1900 */ _(CP,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1908 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1910 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
-  /* 1920 */  _(M,T),  _(M,T),  _(M,B),  _(M,R),  _(M,R), _(M,TR), _(M,TR),  _(M,T),
-  /* 1928 */  _(M,T), _(CS,x), _(CS,x), _(CS,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1930 */ _(CF,x), _(CF,x), _(Bi,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* 1938 */ _(CF,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1940 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
-  /* 1948 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-  /* Tai Le */
-
-  /* 1950 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1958 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1960 */  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
-  /* 1968 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),  _(x,x),  _(x,x),
-  /* 1970 */ _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(TL,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1978 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* New Tai Lue */
-
-  /* 1980 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1988 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1990 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 19A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 19A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19B0 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,L),  _(M,L),  _(M,L),
-  /* 19B8 */  _(M,R),  _(M,R),  _(M,L),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),
-  /* 19C0 */  _(M,R), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* 19C8 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 19D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19E0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19E8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19F0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 19F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Buginese */
-
-  /* 1A00 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),
-  /* 1A18 */  _(M,B),  _(M,L),  _(M,R),  _(M,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Tai Tham */
-
-  /* 1A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A38 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A40 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1A48 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1A50 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x), _(CM,L), _(CM,x), _(CF,x),
-  /* 1A58 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),  _(x,x),
-  /* 1A60 */ _(IS,x),  _(M,R),  _(M,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,T),
-  /* 1A68 */  _(M,T),  _(M,B),  _(M,B),  _(M,T),  _(M,B),  _(M,R),  _(M,L),  _(M,L),
-  /* 1A70 */  _(M,L),  _(M,L),  _(M,L),  _(M,T),  _(M,T), _(TM,x), _(TM,x), _(TM,x),
-  /* 1A78 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A80 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1A88 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1A90 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1A98 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x1b00u 2120
-
-
-  /* Balinese */
-
-  /* 1B00 */ _(Bi,x), _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1B10 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(N,x),  _(M,R),  _(M,T),  _(M,T),
-  /* 1B38 */  _(M,B),  _(M,B),  _(M,B), _(M,BR), _(M,TB),_(M,TBR),  _(M,L),  _(M,L),
-  /* 1B40 */ _(M,LR), _(M,LR),  _(M,T), _(M,TR),  _(V,R),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B48 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1B58 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B60 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B68 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1B78 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Sundanese */
-
-  /* 1B80 */ _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 1B88 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B90 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1B98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BA0 */  _(C,x), _(CS,x), _(CS,x), _(CS,x),  _(M,T),  _(M,B),  _(M,L),  _(M,R),
-  /* 1BA8 */  _(M,T),  _(M,T), _(PK,R), _(IS,x), _(CS,x), _(CS,x),  _(C,x),  _(C,x),
-  /* 1BB0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1BB8 */ _(Nd,x), _(Nd,x),  _(A,x),  _(C,x),  _(C,x),  _(C,x), _(CF,x), _(CF,x),
-
-  /* Batak */
-
-  /* 1BC0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BC8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BD0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BD8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1BE0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x),  _(N,x),  _(M,R),
-  /* 1BE8 */  _(M,T),  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,T),  _(M,R),  _(M,T),
-  /* 1BF0 */ _(CF,x), _(CF,x), _(PK,R), _(PK,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1BF8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Lepcha */
-
-  /* 1C00 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 1C20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CS,x), _(CS,x),  _(M,R),  _(M,L),
-  /* 1C28 */  _(M,L), _(M,TL),  _(M,R),  _(M,R),  _(M,B), _(CF,x), _(CF,x), _(CF,x),
-  /* 1C30 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(Bi,L), _(Bi,L),  _(x,x),  _(N,x),
-  /* 1C38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1C40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 1C48 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-
-#define indic_offset_0x1cd0u 2456
+#define indic_offset_0x1cd0u 1608
 
 
   /* Vedic Extensions */
 
-  /* 1CD0 */ _(TM,x), _(TM,x), _(TM,x),  _(x,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
-  /* 1CD8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
-  /* 1CE0 */ _(TM,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CE8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x), _(TM,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 1CD0 */ _(Ca,T), _(Ca,T), _(Ca,T),  _(x,x), _(Ca,O), _(Ca,B), _(Ca,B), _(Ca,B),
+  /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
+  /* 1CE0 */ _(Ca,T), _(Ca,R),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),
+  /* 1CE8 */  _(x,O),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,B),  _(x,x),  _(x,x),
+  /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),
+  /* 1CF8 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0x2008u 2496
+#define indic_offset_0x2008u 1656
 
 
   /* General Punctuation */
 
   /* 2008 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),_(ZWNJ,x),_(ZWJ,x),  _(x,x),  _(x,x),
-  /* 2010 */  _(x,x),  _(x,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 2010 */ _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa800u 2512
+#define indic_offset_0x2070u 1672
 
 
-  /* Syloti Nagri */
+  /* Superscripts and Subscripts */
 
-  /* A800 */ _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(PK,T),  _(C,x),
-  /* A808 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A810 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A818 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A820 */  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,R),  _(M,B),  _(M,T),  _(M,R),
-  /* A828 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A830 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A838 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 2070 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 2078 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 2080 */  _(x,x),  _(x,x), _(SM,x), _(SM,x), _(SM,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Phags-pa */
+#define indic_offset_0xa8e0u 1696
 
-  /* A840 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A848 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A850 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A858 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(Vo,x),
-  /* A860 */ _(Vo,x), _(Vo,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Vo,x), _(CS,x),
-  /* A868 */ _(CS,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A870 */  _(C,x), _(CS,x),  _(C,x), _(Bi,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A878 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Saurashtra */
-
-  /* A880 */ _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* A888 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* A890 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A898 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A8B0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(CF,x),  _(M,R),  _(M,R),  _(M,R),
-  /* A8B8 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(M,R),
-  /* A8C0 */  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(V,B),  _(x,x),  _(x,x),  _(x,x),
-  /* A8C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A8D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Devanagari Extended */
 
-  /* A8E0 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
-  /* A8E8 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
-  /* A8F0 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A8F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+  /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+  /* A8F0 */ _(Ca,T), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-  /* Kayah Li */
+#define indic_offset_0xa9e0u 1720
 
-  /* A900 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A908 */ _(Nd,x), _(Nd,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A910 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A918 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A920 */  _(C,x),  _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
-  /* A928 */ _(Vo,x), _(Vo,x), _(Vo,x), _(TM,x), _(TM,x), _(TM,x),  _(x,x),  _(x,x),
-
-  /* Rejang */
-
-  /* A930 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A938 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A940 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,B),
-  /* A948 */  _(M,B),  _(M,B),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B), _(CF,x),
-  /* A950 */ _(CF,x), _(CF,x), _(CF,x), _(PK,R),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A958 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A960 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A968 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A970 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A978 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Javanese */
-
-  /* A980 */ _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* A988 */ _(VI,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
-  /* A990 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9B0 */  _(C,x),  _(C,x),  _(C,x),  _(N,x),  _(M,R),  _(M,R),  _(M,T),  _(M,T),
-  /* A9B8 */  _(M,B),  _(M,B),  _(M,L),  _(M,L),  _(M,T), _(CS,x), _(CM,x), _(CM,x),
-  /* A9C0 */ _(V,BR),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A9D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Myanmar Extended-B */
 
-  /* A9E0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(C,x),
+  /* A9E0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),  _(x,x),  _(C,x),
   /* A9E8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* A9F8 */ _(Nd,x), _(Nd,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
 
-  /* Cham */
+#define indic_offset_0xaa60u 1752
 
-  /* AA00 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
-  /* AA08 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA28 */  _(C,x),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,T),  _(M,L),
-  /* AA30 */  _(M,L),  _(M,T),  _(M,B), _(CM,x), _(CM,L), _(CM,x), _(CM,x),  _(x,x),
-  /* AA38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AA40 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* AA48 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),  _(x,x),  _(x,x),
-  /* AA50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* AA58 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Myanmar Extended-A */
 
   /* AA60 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* AA68 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,x), _(TM,x), _(TM,x),  _(C,x),  _(C,x),
+  /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),
+  /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
-  /* Tai Viet */
-
-  /* AA80 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA88 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA90 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AA98 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAA0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAA8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAB0 */  _(M,T),  _(M,R),  _(M,T),  _(M,T),  _(M,B),_(M,VOL),_(M,VOL),  _(M,T),
-  /* AAB8 */  _(M,T),_(M,VOL),  _(M,R),_(M,VOL),_(M,VOL),  _(M,R),  _(M,T), _(TM,x),
-  /* AAC0 */ _(TL,x), _(TM,x), _(TL,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AAC8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AAD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* AAD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Meetei Mayek Extensions */
-
-  /* AAE0 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* AAE8 */  _(C,x),  _(C,x),  _(C,x),  _(M,L),  _(M,B),  _(M,T),  _(M,L),  _(M,R),
-  /* AAF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Vs,x), _(IS,x),  _(x,x),
-
-#define indic_offset_0xabc0u 3272
-
-
-  /* Meetei Mayek */
-
-  /* ABC0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* ABC8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x),
-  /* ABD0 */  _(C,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* ABD8 */  _(C,x),  _(C,x),  _(C,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
-  /* ABE0 */ _(CF,x), _(CF,x), _(CF,x),  _(M,R),  _(M,R),  _(M,T),  _(M,R),  _(M,R),
-  /* ABE8 */  _(M,B),  _(M,R),  _(M,R),  _(x,x), _(TM,x), _(PK,B),  _(x,x),  _(x,x),
-  /* ABF0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* ABF8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x10a00u 3336
-
-
-  /* Kharoshthi */
-
-  /* 10A00 */  _(C,x),  _(M,O),  _(M,B),  _(M,B),  _(x,x),  _(M,T),  _(M,O),  _(x,x),
-  /* 10A08 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,B),  _(x,x), _(Bi,x), _(Vs,x),
-  /* 10A10 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A18 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 10A30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 10A38 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(IS,x),
-  /* 10A40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-#define indic_offset_0x11000u 3408
-
-
-  /* Brahmi */
-
-  /* 11000 */ _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11010 */ _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11018 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11020 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11028 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11030 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11038 */  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
-  /* 11040 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),
-  /* 11048 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11050 */  _(x,x),  _(x,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
-  /* 11058 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
-  /* 11060 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), _(Nd,x), _(Nd,x),
-  /* 11068 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 11070 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11078 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(NJ,x),
-
-  /* Kaithi */
-
-  /* 11080 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11088 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11090 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11098 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 110A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 110A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 110B0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,R),
-  /* 110B8 */  _(M,R),  _(V,B),  _(N,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11100u 3600
-
-
-  /* Chakma */
-
-  /* 11100 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
-  /* 11108 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11110 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11118 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11120 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),
-  /* 11128 */  _(M,T),  _(M,T),  _(M,B),  _(M,B),  _(M,L),  _(M,T), _(M,TB), _(M,TB),
-  /* 11130 */  _(M,T),  _(M,B),  _(M,B), _(IS,x), _(PK,T),  _(x,x), _(Nd,x), _(Nd,x),
-  /* 11138 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 11140 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11148 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Mahajani */
-
-  /* 11150 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11158 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11160 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11168 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11170 */  _(C,x),  _(C,x),  _(C,x),  _(N,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11178 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Sharada */
-
-  /* 11180 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11188 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11190 */ _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11198 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 111A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 111A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 111B0 */  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),
-  /* 111B8 */  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T), _(M,TR),
-  /* 111C0 */  _(V,R),  _(A,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Sinhala Archaic Numbers */
-
-  /* 111E0 */  _(x,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 111F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 111F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Khojki */
-
-  /* 11200 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11208 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11210 */  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11218 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11220 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11228 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,R),  _(M,R),  _(M,R),  _(M,B),
-  /* 11230 */  _(M,T),  _(M,T), _(M,TR), _(M,TR), _(Bi,x),  _(V,R),  _(N,x), _(GM,T),
-
-#define indic_offset_0x112b0u 3912
-
-
-  /* Khudawadi */
-
-  /* 112B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 112B8 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112C0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112C8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112D0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 112D8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x), _(Bi,x),
-  /* 112E0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),
-  /* 112E8 */  _(M,T),  _(N,x), _(PK,B),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 112F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 112F8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Grantha */
-
-  /* 11300 */  _(x,x), _(Bi,x), _(Bi,x), _(Vs,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11308 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),  _(x,x), _(VI,x),
-  /* 11310 */ _(VI,x),  _(x,x),  _(x,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11318 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11320 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11328 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11330 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11338 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,x),  _(A,x),  _(M,R),  _(M,R),
-  /* 11340 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(x,x),  _(M,L),
-  /* 11348 */  _(M,L),  _(x,x),  _(x,x), _(M,LR), _(M,LR),  _(V,R),  _(x,x),  _(x,x),
-  /* 11350 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),
-  /* 11358 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11360 */ _(VI,x), _(VI,x),  _(M,R),  _(M,R),  _(x,x),  _(x,x), _(Ca,x), _(Ca,x),
-  /* 11368 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11370 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11480u 4112
-
-
-  /* Tirhuta */
-
-  /* 11480 */  _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11488 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
-  /* 11490 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11498 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 114B0 */  _(M,R),  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
-  /* 114B8 */  _(M,B),  _(M,L),  _(M,T), _(M,TL), _(M,LR),  _(M,R), _(M,LR), _(Bi,x),
-  /* 114C0 */ _(Bi,x), _(Vs,x),  _(V,B),  _(N,x),  _(A,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 114C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 114D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 114D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11580u 4208
-
-
-  /* Siddham */
-
-  /* 11580 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11588 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
-  /* 11590 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11598 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 115A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 115A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,R),
-  /* 115B0 */  _(M,L),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),
-  /* 115B8 */  _(M,L), _(M,TL), _(M,LR),_(M,TLR), _(Bi,x), _(Bi,x), _(Vs,x),  _(V,B),
-  /* 115C0 */  _(N,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-#define indic_offset_0x11600u 4280
-
-
-  /* Modi */
-
-  /* 11600 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11608 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),
-  /* 11610 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11618 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11620 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11628 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11630 */  _(M,R),  _(M,R),  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(M,B),
-  /* 11638 */  _(M,B),  _(M,T),  _(M,T),  _(M,R),  _(M,R), _(Bi,x), _(Vs,x),  _(V,B),
-  /* 11640 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11648 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11650 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 11658 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11660 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11668 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11670 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 11678 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-  /* Takri */
-
-  /* 11680 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* 11688 */ _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11690 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 11698 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 116A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 116A8 */  _(C,x),  _(C,x),  _(C,x), _(Bi,x), _(Vs,x),  _(M,T),  _(M,L),  _(M,R),
-  /* 116B0 */  _(M,B),  _(M,B),  _(M,T),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(N,x),
-  /* 116B8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 116C0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* 116C8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
-}; /* Table items: 4488; occupancy: 73% */
+}; /* Table items: 1784; occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
@@ -862,40 +399,27 @@ hb_indic_get_categories (hb_codepoint_t u)
   {
     case 0x0u:
       if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
-      if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u];
+      if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
       if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
       if (unlikely (u == 0x00A0u)) return _(CP,x);
       break;
 
     case 0x1u:
       if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
-      if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
-      if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
-      if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
-      if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+      if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
+      if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
       break;
 
     case 0x2u:
       if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+      if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
       if (unlikely (u == 0x25CCu)) return _(CP,x);
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
-      if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
-      break;
-
-    case 0x10u:
-      if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
-      break;
-
-    case 0x11u:
-      if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
-      if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u];
-      if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
-      if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
-      if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u];
+      if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+      if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+      if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
       break;
 
     default:
@@ -914,11 +438,14 @@ hb_indic_get_categories (hb_codepoint_t u)
 #undef ISC_CD
 #undef ISC_CF
 #undef ISC_CHL
+#undef ISC_CK
 #undef ISC_CM
 #undef ISC_CP
 #undef ISC_CPR
+#undef ISC_CPrf
 #undef ISC_CS
 #undef ISC_CSR
+#undef ISC_CWS
 #undef ISC_GM
 #undef ISC_IS
 #undef ISC_ZWJ
@@ -930,6 +457,7 @@ hb_indic_get_categories (hb_codepoint_t u)
 #undef ISC_x
 #undef ISC_PK
 #undef ISC_RS
+#undef ISC_SM
 #undef ISC_TL
 #undef ISC_TM
 #undef ISC_V
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
index 93546dbec59..6486e84f5d9 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
@@ -176,24 +176,8 @@ set_indic_properties (hb_glyph_info_t &info)
    * Re-assign category
    */
 
-
-  /* The spec says U+0952 is OT_A.  However, testing shows that Uniscribe
-   * treats a whole bunch of characters similarly.
-   * TESTS: For example, for U+0951:
-   * U+092E,U+0947,U+0952
-   * U+092E,U+0952,U+0947
-   * U+092E,U+0947,U+0951
-   * U+092E,U+0951,U+0947
-   * U+092E,U+0951,U+0952
-   * U+092E,U+0952,U+0951
-   */
-  if (unlikely (hb_in_ranges (u, 0x0951u, 0x0952u,
-                                 0x1CD0u, 0x1CD2u,
-                                 0x1CD4u, 0x1CE1u) ||
-                            u == 0x1CF4u))
-    cat = OT_A;
   /* The following act more like the Bindus. */
-  else if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
+  if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
     cat = OT_SM;
   /* The following act like consonants. */
   else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u,
@@ -216,21 +200,10 @@ set_indic_properties (hb_glyph_info_t &info)
     cat = OT_Symbol;
     ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
   }
-  else if (unlikely (hb_in_range (u, 0x17CDu, 0x17D1u) ||
-                     u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
-  {
-    /* These are like Top Matras. */
-    cat = OT_M;
-    pos = POS_ABOVE_C;
-  }
   else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
-  else if (unlikely (u == 0x17D2u)) cat = OT_Coeng; /* Khmer coeng */
   else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
                                     cat = OT_PLACEHOLDER;
   else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-  else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */
-  else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */
-  else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */
 
 
   /*
@@ -296,11 +269,6 @@ enum blwf_mode_t {
   BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */
   BLWF_MODE_POST_ONLY     /* Below-forms feature applied to post-base only. */
 };
-enum pref_len_t {
-  PREF_LEN_1 = 1,
-  PREF_LEN_2 = 2,
-  PREF_LEN_DONT_CARE = PREF_LEN_2
-};
 struct indic_config_t
 {
   hb_script_t     script;
@@ -310,26 +278,24 @@ struct indic_config_t
   reph_position_t reph_pos;
   reph_mode_t     reph_mode;
   blwf_mode_t     blwf_mode;
-  pref_len_t      pref_len;
 };
 
 static const indic_config_t indic_configs[] =
 {
   /* Default.  Should be first. */
-  {HB_SCRIPT_INVALID,   false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
-  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_BENGALI,   true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GURMUKHI,  true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GUJARATI,  true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_ORIYA,     true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_TAMIL,     true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_TELUGU,    true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_KANNADA,   true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+  {HB_SCRIPT_INVALID,   false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_BENGALI,   true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GURMUKHI,  true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GUJARATI,  true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_ORIYA,     true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TAMIL,     true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TELUGU,    true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_KANNADA,   true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,   false,0x0DCAu,BASE_POS_LAST_SINHALA,
-                                                     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_KHMER,     false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_JAVANESE,  false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
+                                                     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_KHMER,     false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
 };
 
 
@@ -512,12 +478,12 @@ struct indic_shape_plan_t
     hb_codepoint_t glyph = virama_glyph;
     if (unlikely (virama_glyph == (hb_codepoint_t) -1))
     {
-      if (!config->virama || !font->get_glyph (config->virama, 0, &glyph))
+      if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph))
         glyph = 0;
       /* Technically speaking, the spec says we should apply 'locl' to virama too.
        * Maybe one day... */
 
-      /* Our get_glyph() function needs a font, so we can't get the virama glyph
+      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
        * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
       (const_cast (this))->virama_glyph = glyph;
     }
@@ -557,8 +523,15 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
   indic_plan->virama_glyph = (hb_codepoint_t) -1;
 
   /* Use zero-context would_substitute() matching for new-spec of the main
-   * Indic scripts, and scripts with one spec only, but not for old-specs. */
-  bool zero_context = !indic_plan->is_old_spec;
+   * Indic scripts, and scripts with one spec only, but not for old-specs.
+   * The new-spec for all dual-spec scripts says zero-context matching happens.
+   *
+   * However, testing with Malayalam shows that old and new spec both allow
+   * context.  Testing with Bengali new-spec however shows that it doesn't.
+   * So, the heuristic here is the way it is.  It should *only* be changed,
+   * as we discover more cases of what Windows does.  DON'T TOUCH OTHERWISE.
+   */
+  bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
   indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
   indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
   indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
@@ -600,12 +573,8 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
   if (indic_plan->pstf.would_substitute (glyphs  , 2, face) ||
       indic_plan->pstf.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
-  unsigned int pref_len = indic_plan->config->pref_len;
-  if ((pref_len == PREF_LEN_2 &&
-       (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
-        indic_plan->pref.would_substitute (glyphs+1, 2, face)))
-   || (pref_len == PREF_LEN_1 &&
-       indic_plan->pref.would_substitute (glyphs+1, 1, face)))
+  if (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
+      indic_plan->pref.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
   return POS_BASE_C;
 }
@@ -754,10 +723,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
 
     switch (indic_plan->config->base_pos)
     {
-      default:
-        assert (false);
-        /* fallthrough */
-
       case BASE_POS_LAST:
       {
         /* -> starting from the end of the syllable, move backwards */
@@ -1115,10 +1080,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
       }
   }
 
-  unsigned int pref_len = indic_plan->config->pref_len;
+  unsigned int pref_len = 2;
   if (indic_plan->mask_array[PREF] && base + pref_len < end)
   {
-    assert (1 <= pref_len && pref_len <= 2);
     /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
     for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
       hb_codepoint_t glyphs[2];
@@ -1231,7 +1195,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
 
   hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
     return;
 
   hb_glyph_info_t dottedcircle = {0};
@@ -1243,7 +1207,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
   buffer->idx = 0;
   unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len)
+  while (buffer->idx < buffer->len && !buffer->in_error)
   {
     unsigned int syllable = buffer->cur().syllable();
     syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -1251,19 +1215,19 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
     {
       last_syllable = syllable;
 
-      hb_glyph_info_t info = dottedcircle;
-      info.cluster = buffer->cur().cluster;
-      info.mask = buffer->cur().mask;
-      info.syllable() = buffer->cur().syllable();
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
       /* TODO Set glyph_props? */
 
       /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len &&
+      while (buffer->idx < buffer->len && !buffer->in_error &&
              last_syllable == buffer->cur().syllable() &&
              buffer->cur().indic_category() == OT_Repha)
         buffer->next_glyph ();
 
-      buffer->output_info (info);
+      buffer->output_info (ginfo);
     }
     else
       buffer->next_glyph ();
@@ -1328,7 +1292,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
   for (base = start; base < end; base++)
     if (info[base].indic_position() >= POS_BASE_C)
     {
-      if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2)
+      if (try_pref && base + 1 < end)
       {
         for (unsigned int i = base + 1; i < end; i++)
           if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
@@ -1348,6 +1312,25 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
             break;
           }
       }
+      /* For Malayalam, skip over unformed below- (but NOT post-) forms. */
+      if (buffer->props.script == HB_SCRIPT_MALAYALAM)
+      {
+        for (unsigned int i = base + 1; i < end; i++)
+        {
+          while (i < end && is_joiner (info[i]))
+            i++;
+          if (i == end || !is_halant_or_coeng (info[i]))
+            break;
+          i++; /* Skip halant. */
+          while (i < end && is_joiner (info[i]))
+            i++;
+          if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C)
+          {
+            base = i;
+            info[base].indic_position() = POS_BASE_C;
+          }
+        }
+      }
 
       if (start < base && info[base].indic_position() > POS_BASE_C)
         base--;
@@ -1591,7 +1574,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
 
   if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
   {
-    unsigned int pref_len = indic_plan->config->pref_len;
     for (unsigned int i = base + 1; i < end; i++)
       if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
       {
@@ -1602,10 +1584,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
         /* Note: We just check that something got substituted.  We don't check that
          * the  feature actually did it...
          *
-         * If pref len is longer than one, then only reorder if it ligated.  If
-         * pref len is one, only reorder if it didn't ligate with other things. */
-        if (_hb_glyph_info_substituted (&info[i]) &&
-            ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+         * Reorder pref only if it ligated. */
+        if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
         {
           /*
            *       2. Try to find a target position the same way as for pre-base matra.
@@ -1631,8 +1611,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
             if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
             {
               unsigned int old_pos = i;
-              for (unsigned int i = base + 1; i < old_pos; i++)
-                if (info[i].indic_category() == OT_M)
+              for (unsigned int j = base + 1; j < old_pos; j++)
+                if (info[j].indic_category() == OT_M)
                 {
                   new_pos--;
                   break;
@@ -1796,7 +1776,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
     hb_codepoint_t glyph;
 
     if (hb_options ().uniscribe_bug_compatible ||
-        (c->font->get_glyph (ab, 0, &glyph) &&
+        (c->font->get_nominal_glyph (ab, &glyph) &&
          indic_plan->pstf.would_substitute (&glyph, 1, c->font->face)))
     {
       /* Ok, safe to use Uniscribe-style decomposition. */
@@ -1806,7 +1786,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
     }
   }
 
-  return c->unicode->decompose (ab, a, b);
+  return (bool) c->unicode->decompose (ab, a, b);
 }
 
 static bool
@@ -1822,7 +1802,7 @@ compose_indic (const hb_ot_shape_normalize_context_t *c,
   /* Composition-exclusion exceptions that we want to recompose. */
   if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; }
 
-  return c->unicode->compose (a, b, ab);
+  return (bool) c->unicode->compose (a, b, ab);
 }
 
 
@@ -1834,6 +1814,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
   data_create_indic,
   data_destroy_indic,
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   decompose_indic,
   compose_indic,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
index 8aef4cf45e5..c16b4fda39e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
@@ -1,5 +1,5 @@
 
-#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 /*
  * Copyright © 2011,2012  Google, Inc.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
         1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u,
         3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u,
@@ -261,11 +261,11 @@ static const int myanmar_syllable_machine_error = -1;
 static const int myanmar_syllable_machine_en_main = 0;
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
 
-#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -285,7 +285,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 289 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
         {
         cs = myanmar_syllable_machine_start;
         ts = 0;
@@ -293,7 +293,7 @@ find_syllables (hb_buffer_t *buffer)
         act = 0;
         }
 
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
@@ -302,7 +302,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
 
-#line 306 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
         {
         int _slen;
         int _trans;
@@ -316,7 +316,7 @@ _resume:
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
         }
 
         _keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -335,38 +335,38 @@ _eof_trans:
 
         switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
         case 7:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p+1;{ found_syllable (consonant_syllable); }}
         break;
         case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p+1;{ found_syllable (non_myanmar_cluster); }}
         break;
         case 10:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p+1;{ found_syllable (punctuation_cluster); }}
         break;
         case 4:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p+1;{ found_syllable (broken_cluster); }}
         break;
         case 3:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p+1;{ found_syllable (non_myanmar_cluster); }}
         break;
         case 6:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p;p--;{ found_syllable (consonant_syllable); }}
         break;
         case 8:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p;p--;{ found_syllable (broken_cluster); }}
         break;
         case 9:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
         {te = p;p--;{ found_syllable (non_myanmar_cluster); }}
         break;
-#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
         }
 
 _again:
@@ -375,7 +375,7 @@ _again:
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 379 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
         }
 
         if ( ++p != pe )
@@ -391,7 +391,7 @@ _again:
 
         }
 
-#line 123 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
index fe9074cdf65..6c6466275a6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
@@ -199,6 +199,10 @@ set_myanmar_properties (hb_glyph_info_t &info)
       cat = (indic_category_t) OT_A;
       break;
 
+    case 0x1039u:
+      cat = (indic_category_t) OT_H;
+      break;
+
     case 0x103Au:
       cat = (indic_category_t) OT_As;
       break;
@@ -245,6 +249,11 @@ set_myanmar_properties (hb_glyph_info_t &info)
     case 0x104Au: case 0x104Bu:
       cat = (indic_category_t) OT_P;
       break;
+
+    case 0xAA74u: case 0xAA75u: case 0xAA76u:
+      /* https://github.com/roozbehp/unicode-data/issues/3 */
+      cat = (indic_category_t) OT_C;
+      break;
   }
 
   if (cat == OT_M)
@@ -435,7 +444,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
 
   hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
     return;
 
   hb_glyph_info_t dottedcircle = {0};
@@ -447,7 +456,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
   buffer->idx = 0;
   unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len)
+  while (buffer->idx < buffer->len && !buffer->in_error)
   {
     unsigned int syllable = buffer->cur().syllable();
     syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -455,12 +464,12 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
     {
       last_syllable = syllable;
 
-      hb_glyph_info_t info = dottedcircle;
-      info.cluster = buffer->cur().cluster;
-      info.mask = buffer->cur().mask;
-      info.syllable() = buffer->cur().syllable();
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
 
-      buffer->output_info (info);
+      buffer->output_info (ginfo);
     }
     else
       buffer->next_glyph ();
@@ -507,6 +516,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
   NULL, /* data_create */
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   NULL, /* compose */
@@ -523,6 +533,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
   NULL, /* data_create */
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   NULL, /* decompose */
   NULL, /* compose */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
index b4aff25fc43..c1d08dc7145 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
@@ -41,12 +41,8 @@
 
 enum hb_ot_shape_zero_width_marks_type_t {
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
-//  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY,
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
-
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
 };
 
 
@@ -110,6 +106,15 @@ struct hb_ot_complex_shaper_t
                            hb_buffer_t              *buffer,
                            hb_font_t                *font);
 
+  /* postprocess_glyphs()
+   * Called during shape().
+   * Shapers can use to modify glyphs after shaping ends.
+   * May be NULL.
+   */
+  void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
+                              hb_buffer_t              *buffer,
+                              hb_font_t                *font);
+
 
   hb_ot_shape_normalization_mode_t normalization_preference;
 
@@ -236,9 +241,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-3.0 additions */
     case HB_SCRIPT_SINHALA:
 
-    /* Unicode-5.2 additions */
-    case HB_SCRIPT_JAVANESE:
-
       /* If the designer designed the font for the 'DFLT' script,
        * use the default shaper.  Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
@@ -311,7 +313,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-5.2 additions */
     case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
-    //case HB_SCRIPT_JAVANESE:
+    case HB_SCRIPT_JAVANESE:
     case HB_SCRIPT_KAITHI:
     case HB_SCRIPT_MEETEI_MAYEK:
     case HB_SCRIPT_TAI_THAM:
@@ -340,6 +342,15 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_SIDDHAM:
     case HB_SCRIPT_TIRHUTA:
 
+    /* Unicode-8.0 additions */
+    case HB_SCRIPT_AHOM:
+    //case HB_SCRIPT_MULTANI:
+
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_BHAIKSUKI:
+    case HB_SCRIPT_MARCHEN:
+    case HB_SCRIPT_NEWA:
+
       /* If the designer designed the font for the 'DFLT' script,
        * use the default shaper.  Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
index 6934282c12d..e4889d4eff6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
@@ -139,7 +139,6 @@ thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font)
   };
 
   switch (action) {
-    default: assert (false); /* Fallthrough */
     case NOP: return u;
     case SD:  pua_mappings = SD_mappings; break;
     case SDL: pua_mappings = SDL_mappings; break;
@@ -315,7 +314,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
 
   buffer->clear_output ();
   unsigned int count = buffer->len;
-  for (buffer->idx = 0; buffer->idx < count;)
+  for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
   {
     hb_codepoint_t u = buffer->cur().codepoint;
     if (likely (!IS_SARA_AM (u))) {
@@ -330,7 +329,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
     if (unlikely (buffer->in_error))
       return;
 
-    /* Make Nikhahit be recognized as a mark when zeroing widths. */
+    /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
     unsigned int end = buffer->out_len;
     _hb_glyph_info_set_general_category (&buffer->out_info[end - 2], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
 
@@ -372,10 +371,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
   NULL, /* data_create */
   NULL, /* data_destroy */
   preprocess_text_thai,
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   false,/* fallback_position */
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
index 01465a426f8..a77b531daa5 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
@@ -52,10 +52,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
   NULL, /* data_create */
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
index 4e496f089e9..97409f15b0f 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
@@ -36,291 +36,222 @@
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-        0u, 0u, 4u, 4u, 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u,
-        8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u,
-        8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
-        8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
+        1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u,
+        8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
+        8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u,
+        4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
         8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
-        8u, 39u, 12u, 21u, 12u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u,
-        8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
-        8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
+        8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
         42u, 42u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-        0, 1, 1, 40, 1, 32, 32, 1,
-        32, 32, 32, 19, 19, 19, 32, 32,
-        32, 32, 32, 32, 32, 32, 32, 32,
-        32, 32, 32, 1, 32, 32, 19, 19,
+        1, 40, 1, 32, 32, 1, 32, 32,
+        32, 19, 19, 19, 32, 32, 32, 32,
+        32, 32, 32, 32, 32, 32, 32, 9,
+        1, 1, 32, 32, 32, 32, 19, 19,
         19, 32, 32, 32, 32, 32, 32, 32,
-        32, 10, 2, 32, 32, 32, 32, 19,
-        19, 19, 32, 32, 32, 32, 32, 32,
-        32, 32, 32, 32, 39, 32, 22, 2,
+        32, 32, 32, 1, 39, 32, 22, 2,
         1
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-        0, 0, 2, 4, 45, 47, 80, 113,
-        115, 148, 181, 214, 234, 254, 274, 307,
-        340, 373, 406, 439, 472, 505, 538, 571,
-        604, 637, 670, 703, 705, 738, 771, 791,
-        811, 831, 864, 897, 930, 963, 996, 1029,
-        1062, 1095, 1106, 1109, 1142, 1175, 1208, 1241,
-        1261, 1281, 1301, 1334, 1367, 1400, 1433, 1466,
-        1499, 1532, 1565, 1598, 1631, 1671, 1704, 1727,
-        1730
+        0, 2, 43, 45, 78, 111, 113, 146,
+        179, 212, 232, 252, 272, 305, 338, 371,
+        404, 437, 470, 503, 536, 569, 602, 635,
+        645, 647, 649, 682, 715, 748, 781, 801,
+        821, 841, 874, 907, 940, 973, 1006, 1039,
+        1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269,
+        1272
 };
 
 static const char _use_syllable_machine_indicies[] = {
-        1, 0, 3, 2, 4, 5, 6,
-        4, 1, 5, 8, 8, 7, 8, 8,
-        3, 9, 8, 8, 8, 4, 4, 10,
-        11, 8, 8, 12, 13, 14, 15, 16,
-        17, 18, 12, 19, 20, 21, 22, 23,
-        24, 8, 25, 26, 27, 8, 29, 28,
-        31, 30, 30, 32, 33, 30, 30, 30,
-        30, 30, 30, 30, 30, 34, 35, 36,
-        37, 38, 39, 40, 41, 35, 42, 34,
-        43, 44, 45, 46, 30, 47, 48, 49,
-        30, 31, 30, 30, 32, 33, 30, 30,
-        30, 30, 30, 30, 30, 30, 50, 35,
-        36, 37, 38, 39, 40, 41, 35, 42,
-        43, 43, 44, 45, 46, 30, 47, 48,
-        49, 30, 32, 51, 31, 30, 30, 32,
-        33, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 35, 36, 37, 38, 39, 40,
-        41, 35, 42, 43, 43, 44, 45, 46,
-        30, 47, 48, 49, 30, 31, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 35, 36, 37, 38, 39,
-        30, 30, 30, 30, 30, 30, 44, 45,
-        46, 30, 47, 48, 49, 30, 31, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 36, 37, 38,
-        39, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 47, 48, 49, 30, 31,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 37,
-        38, 39, 30, 31, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 38, 39, 30, 31,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 39, 30, 31, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 37, 38, 39, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        47, 48, 49, 30, 31, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 37, 38, 39, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 48, 49, 30, 31, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 37, 38, 39,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 49, 30, 31, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 36, 37, 38,
-        39, 30, 30, 30, 30, 30, 30, 44,
-        45, 46, 30, 47, 48, 49, 30, 31,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 36, 37,
-        38, 39, 30, 30, 30, 30, 30, 30,
-        30, 45, 46, 30, 47, 48, 49, 30,
-        31, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 36,
-        37, 38, 39, 30, 30, 30, 30, 30,
-        30, 30, 30, 46, 30, 47, 48, 49,
-        30, 31, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 35,
-        36, 37, 38, 39, 30, 41, 35, 30,
-        30, 30, 44, 45, 46, 30, 47, 48,
-        49, 30, 31, 30, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        35, 36, 37, 38, 39, 30, 30, 35,
-        30, 30, 30, 44, 45, 46, 30, 47,
-        48, 49, 30, 31, 30, 30, 30, 30,
-        30, 30, 30, 30, 30, 30, 30, 30,
-        30, 35, 36, 37, 38, 39, 40, 41,
-        35, 30, 30, 30, 44, 45, 46, 30,
-        47, 48, 49, 30, 31, 30, 30, 32,
-        33, 30, 30, 30, 30, 30, 30, 30,
-        30, 30, 35, 36, 37, 38, 39, 40,
-        41, 35, 42, 30, 43, 44, 45, 46,
-        30, 47, 48, 49, 30, 31, 30, 30,
-        32, 33, 30, 30, 30, 30, 30, 30,
-        30, 30, 30, 35, 36, 37, 38, 39,
-        40, 41, 35, 42, 34, 43, 44, 45,
-        46, 30, 47, 48, 49, 30, 53, 52,
-        52, 54, 55, 52, 52, 52, 52, 52,
-        52, 52, 52, 56, 52, 57, 58, 59,
-        60, 61, 62, 57, 63, 56, 64, 52,
-        52, 52, 52, 65, 66, 67, 52, 53,
-        52, 52, 54, 55, 52, 52, 52, 52,
-        52, 52, 52, 52, 68, 52, 57, 58,
-        59, 60, 61, 62, 57, 63, 64, 64,
-        52, 52, 52, 52, 65, 66, 67, 52,
-        54, 51, 53, 52, 52, 54, 55, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 57, 58, 59, 60, 61, 62, 57,
-        63, 64, 64, 52, 52, 52, 52, 65,
-        66, 67, 52, 53, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 57, 58, 59, 60, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        65, 66, 67, 52, 53, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 58, 59, 60, 52,
-        53, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 59, 60, 52, 53, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 60, 52,
-        53, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        58, 59, 60, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 65, 66, 67,
-        52, 53, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 58, 59, 60, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 66,
-        67, 52, 53, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 58, 59, 60, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 67, 52, 53, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 57, 58, 59, 60, 52, 62,
-        57, 52, 52, 52, 52, 52, 52, 52,
-        65, 66, 67, 52, 53, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 57, 58, 59, 60, 52,
-        52, 57, 52, 52, 52, 52, 52, 52,
-        52, 65, 66, 67, 52, 53, 52, 52,
-        52, 52, 52, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 57, 58, 59, 60,
-        61, 62, 57, 52, 52, 52, 52, 52,
-        52, 52, 65, 66, 67, 52, 53, 52,
-        52, 54, 55, 52, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 57, 58, 59,
-        60, 61, 62, 57, 63, 52, 64, 52,
-        52, 52, 52, 65, 66, 67, 52, 53,
-        52, 52, 54, 55, 52, 52, 52, 52,
-        52, 52, 52, 52, 52, 52, 57, 58,
-        59, 60, 61, 62, 57, 63, 56, 64,
-        52, 52, 52, 52, 65, 66, 67, 52,
-        70, 71, 69, 69, 69, 69, 69, 69,
-        69, 72, 69, 70, 71, 69, 7, 73,
-        73, 3, 9, 73, 73, 73, 73, 73,
-        73, 73, 73, 74, 12, 13, 14, 15,
-        16, 17, 18, 12, 19, 21, 21, 22,
-        23, 24, 73, 25, 26, 27, 73, 7,
-        73, 73, 3, 9, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 12, 13, 14,
-        15, 16, 17, 18, 12, 19, 21, 21,
-        22, 23, 24, 73, 25, 26, 27, 73,
-        7, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 12, 13,
-        14, 15, 16, 73, 73, 73, 73, 73,
-        73, 22, 23, 24, 73, 25, 26, 27,
-        73, 7, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        13, 14, 15, 16, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 25, 26,
-        27, 73, 7, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 14, 15, 16, 73, 7, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 15,
-        16, 73, 7, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 16, 73, 7, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 14, 15,
-        16, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 25, 26, 27, 73, 7,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 14,
-        15, 16, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 26, 27, 73,
-        7, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        14, 15, 16, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 27,
-        73, 7, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        13, 14, 15, 16, 73, 73, 73, 73,
-        73, 73, 22, 23, 24, 73, 25, 26,
-        27, 73, 7, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 13, 14, 15, 16, 73, 73, 73,
-        73, 73, 73, 73, 23, 24, 73, 25,
-        26, 27, 73, 7, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 13, 14, 15, 16, 73, 73,
-        73, 73, 73, 73, 73, 73, 24, 73,
-        25, 26, 27, 73, 7, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 12, 13, 14, 15, 16, 73,
-        18, 12, 73, 73, 73, 22, 23, 24,
-        73, 25, 26, 27, 73, 7, 73, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 12, 13, 14, 15, 16,
-        73, 73, 12, 73, 73, 73, 22, 23,
-        24, 73, 25, 26, 27, 73, 7, 73,
-        73, 73, 73, 73, 73, 73, 73, 73,
-        73, 73, 73, 73, 12, 13, 14, 15,
-        16, 17, 18, 12, 73, 73, 73, 22,
-        23, 24, 73, 25, 26, 27, 73, 7,
-        73, 73, 3, 9, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 12, 13, 14,
-        15, 16, 17, 18, 12, 19, 73, 21,
-        22, 23, 24, 73, 25, 26, 27, 73,
-        5, 6, 73, 73, 5, 73, 73, 7,
-        73, 73, 3, 9, 73, 73, 73, 73,
-        73, 73, 73, 73, 73, 12, 13, 14,
-        15, 16, 17, 18, 12, 19, 20, 21,
-        22, 23, 24, 73, 25, 26, 27, 73,
-        7, 73, 73, 3, 9, 73, 73, 73,
-        73, 73, 73, 73, 73, 73, 12, 13,
-        14, 15, 16, 17, 18, 12, 19, 20,
-        21, 22, 23, 24, 73, 25, 26, 27,
-        73, 76, 75, 75, 75, 75, 75, 75,
-        75, 75, 75, 75, 75, 75, 75, 75,
-        75, 75, 75, 75, 75, 76, 77, 75,
-        76, 77, 75, 77, 75, 0
+        1, 0, 2, 3, 4, 2, 5, 3,
+        4, 4, 6, 4, 4, 1, 7, 4,
+        4, 4, 2, 2, 8, 9, 4, 4,
+        10, 11, 12, 13, 14, 15, 16, 10,
+        17, 18, 19, 20, 21, 22, 4, 23,
+        24, 25, 4, 27, 26, 29, 28, 28,
+        30, 31, 28, 28, 28, 28, 28, 28,
+        28, 28, 32, 33, 34, 35, 36, 37,
+        38, 39, 33, 40, 32, 41, 42, 43,
+        44, 28, 45, 46, 47, 28, 29, 28,
+        28, 30, 31, 28, 28, 28, 28, 28,
+        28, 28, 28, 48, 33, 34, 35, 36,
+        37, 38, 39, 33, 40, 41, 41, 42,
+        43, 44, 28, 45, 46, 47, 28, 30,
+        49, 29, 28, 28, 30, 31, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 33,
+        34, 35, 36, 37, 38, 39, 33, 40,
+        41, 41, 42, 43, 44, 28, 45, 46,
+        47, 28, 29, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        33, 34, 35, 36, 37, 28, 28, 28,
+        28, 28, 28, 42, 43, 44, 28, 45,
+        46, 47, 28, 29, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 34, 35, 36, 37, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        45, 46, 47, 28, 29, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 35, 36, 37, 28,
+        29, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 36, 37, 28, 29, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 37, 28,
+        29, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        35, 36, 37, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 45, 46, 47,
+        28, 29, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 35, 36, 37, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 46,
+        47, 28, 29, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 35, 36, 37, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 47, 28, 29, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 34, 35, 36, 37, 28, 28,
+        28, 28, 28, 28, 42, 43, 44, 28,
+        45, 46, 47, 28, 29, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 34, 35, 36, 37, 28,
+        28, 28, 28, 28, 28, 28, 43, 44,
+        28, 45, 46, 47, 28, 29, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 34, 35, 36, 37,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        44, 28, 45, 46, 47, 28, 29, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 33, 34, 35, 36,
+        37, 28, 39, 33, 28, 28, 28, 42,
+        43, 44, 28, 45, 46, 47, 28, 29,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 33, 34, 35,
+        36, 37, 28, 28, 33, 28, 28, 28,
+        42, 43, 44, 28, 45, 46, 47, 28,
+        29, 28, 28, 28, 28, 28, 28, 28,
+        28, 28, 28, 28, 28, 28, 33, 34,
+        35, 36, 37, 38, 39, 33, 28, 28,
+        28, 42, 43, 44, 28, 45, 46, 47,
+        28, 29, 28, 28, 30, 31, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 33,
+        34, 35, 36, 37, 38, 39, 33, 40,
+        28, 41, 42, 43, 44, 28, 45, 46,
+        47, 28, 29, 28, 28, 30, 31, 28,
+        28, 28, 28, 28, 28, 28, 28, 28,
+        33, 34, 35, 36, 37, 38, 39, 33,
+        40, 32, 41, 42, 43, 44, 28, 45,
+        46, 47, 28, 51, 50, 50, 50, 50,
+        50, 50, 50, 52, 50, 5, 53, 51,
+        50, 6, 54, 54, 1, 55, 54, 54,
+        54, 54, 54, 54, 54, 54, 56, 10,
+        11, 12, 13, 14, 15, 16, 10, 17,
+        19, 19, 20, 21, 22, 54, 23, 24,
+        25, 54, 6, 54, 54, 1, 55, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        10, 11, 12, 13, 14, 15, 16, 10,
+        17, 19, 19, 20, 21, 22, 54, 23,
+        24, 25, 54, 6, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 10, 11, 12, 13, 14, 54, 54,
+        54, 54, 54, 54, 20, 21, 22, 54,
+        23, 24, 25, 54, 6, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 11, 12, 13, 14, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 23, 24, 25, 54, 6, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 12, 13, 14,
+        54, 6, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 13, 14, 54, 6, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 14,
+        54, 6, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 12, 13, 14, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 23, 24,
+        25, 54, 6, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 12, 13, 14, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        24, 25, 54, 6, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 12, 13, 14, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 25, 54, 6, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 11, 12, 13, 14, 54,
+        54, 54, 54, 54, 54, 20, 21, 22,
+        54, 23, 24, 25, 54, 6, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 11, 12, 13, 14,
+        54, 54, 54, 54, 54, 54, 54, 21,
+        22, 54, 23, 24, 25, 54, 6, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 11, 12, 13,
+        14, 54, 54, 54, 54, 54, 54, 54,
+        54, 22, 54, 23, 24, 25, 54, 6,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 10, 11, 12,
+        13, 14, 54, 16, 10, 54, 54, 54,
+        20, 21, 22, 54, 23, 24, 25, 54,
+        6, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 10, 11,
+        12, 13, 14, 54, 54, 10, 54, 54,
+        54, 20, 21, 22, 54, 23, 24, 25,
+        54, 6, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 10,
+        11, 12, 13, 14, 15, 16, 10, 54,
+        54, 54, 20, 21, 22, 54, 23, 24,
+        25, 54, 6, 54, 54, 1, 55, 54,
+        54, 54, 54, 54, 54, 54, 54, 54,
+        10, 11, 12, 13, 14, 15, 16, 10,
+        17, 54, 19, 20, 21, 22, 54, 23,
+        24, 25, 54, 1, 57, 3, 54, 54,
+        54, 3, 54, 54, 6, 54, 54, 1,
+        55, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 10, 11, 12, 13, 14, 15,
+        16, 10, 17, 18, 19, 20, 21, 22,
+        54, 23, 24, 25, 54, 6, 54, 54,
+        1, 55, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 10, 11, 12, 13, 14,
+        15, 16, 10, 17, 18, 19, 20, 21,
+        22, 54, 23, 24, 25, 54, 59, 58,
+        58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 59, 60, 58, 59, 60, 58,
+        60, 58, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-        3, 41, 3, 43, 4, 5, 25, 3,
-        0, 2, 60, 62, 45, 46, 47, 48,
-        49, 56, 57, 58, 61, 59, 53, 54,
-        55, 50, 51, 52, 3, 3, 3, 3,
-        6, 7, 24, 9, 10, 11, 12, 13,
-        20, 21, 22, 23, 17, 18, 19, 14,
-        15, 16, 8, 3, 3, 3, 26, 27,
-        40, 29, 30, 31, 32, 36, 37, 38,
-        39, 33, 34, 35, 28, 3, 3, 1,
-        42, 3, 44, 3, 63, 64
+        1, 26, 2, 3, 1, 23, 1, 43,
+        44, 46, 28, 29, 30, 31, 32, 39,
+        40, 41, 45, 42, 36, 37, 38, 33,
+        34, 35, 1, 1, 1, 1, 4, 5,
+        22, 7, 8, 9, 10, 11, 18, 19,
+        20, 21, 15, 16, 17, 12, 13, 14,
+        6, 1, 1, 24, 25, 1, 1, 0,
+        27, 1, 1, 47, 48
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-        1, 2, 3, 4, 0, 0, 0, 7,
-        0, 0, 4, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 4, 4, 0, 0,
-        0, 0, 0, 0, 8, 9, 10, 11,
+        1, 2, 0, 0, 5, 0, 6, 0,
+        2, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 2, 2, 0, 0, 0, 0,
+        0, 0, 7, 8, 9, 10, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 12, 13, 14, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 15, 16, 0,
-        2, 17, 4, 18, 0, 0
+        0, 11, 12, 0, 0, 13, 14, 0,
+        2, 15, 16, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-        0, 0, 0, 5, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0,
+        0, 3, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
@@ -330,9 +261,7 @@ static const char _use_syllable_machine_to_state_actions[] = {
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-        0, 0, 0, 6, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0,
+        0, 4, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0,
@@ -342,29 +271,27 @@ static const char _use_syllable_machine_from_state_actions[] = {
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-        0, 1, 3, 0, 29, 31, 31, 52,
-        31, 31, 31, 31, 31, 31, 31, 31,
-        31, 31, 31, 31, 31, 31, 31, 31,
-        31, 53, 53, 52, 53, 53, 53, 53,
-        53, 53, 53, 53, 53, 53, 53, 53,
-        53, 70, 70, 74, 74, 74, 74, 74,
-        74, 74, 74, 74, 74, 74, 74, 74,
-        74, 74, 74, 74, 74, 74, 76, 76,
-        76
+        1, 0, 27, 29, 29, 50, 29, 29,
+        29, 29, 29, 29, 29, 29, 29, 29,
+        29, 29, 29, 29, 29, 29, 29, 51,
+        54, 51, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 58, 55, 55, 59, 59,
+        59
 };
 
-static const int use_syllable_machine_start = 3;
-static const int use_syllable_machine_first_final = 3;
-static const int use_syllable_machine_error = 0;
+static const int use_syllable_machine_start = 1;
+static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 3;
+static const int use_syllable_machine_en_main = 1;
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
 
 
 
-#line 145 "hb-ot-shape-complex-use-machine.rl"
+#line 138 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -384,7 +311,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 388 "hb-ot-shape-complex-use-machine.hh"
+#line 315 "hb-ot-shape-complex-use-machine.hh"
         {
         cs = use_syllable_machine_start;
         ts = 0;
@@ -392,7 +319,7 @@ find_syllables (hb_buffer_t *buffer)
         act = 0;
         }
 
-#line 166 "hb-ot-shape-complex-use-machine.rl"
+#line 159 "hb-ot-shape-complex-use-machine.rl"
 
 
   p = 0;
@@ -401,7 +328,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
 
-#line 405 "hb-ot-shape-complex-use-machine.hh"
+#line 332 "hb-ot-shape-complex-use-machine.hh"
         {
         int _slen;
         int _trans;
@@ -409,15 +336,13 @@ find_syllables (hb_buffer_t *buffer)
         const char *_inds;
         if ( p == pe )
                 goto _test_eof;
-        if ( cs == 0 )
-                goto _out;
 _resume:
         switch ( _use_syllable_machine_from_state_actions[cs] ) {
-        case 6:
+        case 4:
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 421 "hb-ot-shape-complex-use-machine.hh"
+#line 346 "hb-ot-shape-complex-use-machine.hh"
         }
 
         _keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -439,92 +364,70 @@ _eof_trans:
 #line 1 "NONE"
         {te = p+1;}
         break;
-        case 9:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+        case 8:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
         {te = p+1;{ found_syllable (independent_cluster); }}
         break;
-        case 11:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
-        {te = p+1;{ found_syllable (consonant_cluster); }}
+        case 10:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+        {te = p+1;{ found_syllable (standard_cluster); }}
         break;
-        case 14:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
-        {te = p+1;{ found_syllable (vowel_cluster); }}
-        break;
-        case 16:
-#line 138 "hb-ot-shape-complex-use-machine.rl"
-        {te = p+1;{ found_syllable (number_joiner_terminated_cluster); }}
-        break;
-        case 7:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+        case 6:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
         {te = p+1;{ found_syllable (broken_cluster); }}
         break;
-        case 8:
+        case 5:
 #line 134 "hb-ot-shape-complex-use-machine.rl"
+        {te = p+1;{ found_syllable (non_cluster); }}
+        break;
+        case 7:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
         {te = p;p--;{ found_syllable (independent_cluster); }}
         break;
-        case 12:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+        case 11:
+#line 128 "hb-ot-shape-complex-use-machine.rl"
         {te = p;p--;{ found_syllable (virama_terminated_cluster); }}
         break;
-        case 10:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
-        {te = p;p--;{ found_syllable (consonant_cluster); }}
+        case 9:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+        {te = p;p--;{ found_syllable (standard_cluster); }}
         break;
         case 13:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
-        {te = p;p--;{ found_syllable (vowel_cluster); }}
+#line 130 "hb-ot-shape-complex-use-machine.rl"
+        {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
         break;
-        case 15:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
+        case 12:
+#line 131 "hb-ot-shape-complex-use-machine.rl"
         {te = p;p--;{ found_syllable (numeral_cluster); }}
         break;
-        case 18:
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+        case 16:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
         {te = p;p--;{ found_syllable (symbol_cluster); }}
         break;
-        case 17:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+        case 14:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
         {te = p;p--;{ found_syllable (broken_cluster); }}
         break;
+        case 15:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+        {te = p;p--;{ found_syllable (non_cluster); }}
+        break;
         case 1:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
-        {{p = ((te))-1;}{ found_syllable (numeral_cluster); }}
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
         break;
-        case 3:
-#line 1 "NONE"
-        {       switch( act ) {
-        case 0:
-        {{cs = 0; goto _again;}}
-        break;
-        case 8:
-        {{p = ((te))-1;} found_syllable (broken_cluster); }
-        break;
-        }
-        }
-        break;
-        case 4:
-#line 1 "NONE"
-        {te = p+1;}
-#line 141 "hb-ot-shape-complex-use-machine.rl"
-        {act = 8;}
-        break;
-#line 513 "hb-ot-shape-complex-use-machine.hh"
+#line 420 "hb-ot-shape-complex-use-machine.hh"
         }
 
 _again:
         switch ( _use_syllable_machine_to_state_actions[cs] ) {
-        case 5:
+        case 3:
 #line 1 "NONE"
         {ts = 0;}
-#line 1 "NONE"
-        {act = 0;}
         break;
-#line 524 "hb-ot-shape-complex-use-machine.hh"
+#line 429 "hb-ot-shape-complex-use-machine.hh"
         }
 
-        if ( cs == 0 )
-                goto _out;
         if ( ++p != pe )
                 goto _resume;
         _test_eof: {}
@@ -536,10 +439,9 @@ _again:
         }
         }
 
-        _out: {}
         }
 
-#line 175 "hb-ot-shape-complex-use-machine.rl"
+#line 168 "hb-ot-shape-complex-use-machine.rl"
 
 }
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
index 0febf8daccf..590fce2d95a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
@@ -46,7 +46,6 @@ enum use_category_t {
   USE_O         = 0,    /* OTHER */
 
   USE_B         = 1,    /* BASE */
-  USE_IV        = 2,    /* BASE_VOWEL */
   USE_IND       = 3,    /* BASE_IND */
   USE_N         = 4,    /* BASE_NUM */
   USE_GB        = 5,    /* BASE_OTHER */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
index 09d94574823..645576f6f37 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # IndicPositionalCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
@@ -24,7 +24,6 @@
 #define H       USE_H   /* HALANT */
 #define HN      USE_HN  /* HALANT_NUM */
 #define IND     USE_IND /* BASE_IND */
-#define IV      USE_IV  /* BASE_VOWEL */
 #define N       USE_N   /* BASE_NUM */
 #define O       USE_O   /* OTHER */
 #define R       USE_R   /* REPHA */
@@ -80,30 +79,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Devanagari */
 
-  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 0910 */    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
   /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
   /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0960 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0970 */     O,     O,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
 
   /* Bengali */
 
-  /* 0980 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 0990 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0980 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
   /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,   IND,     O,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 09E0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Gurmukhi */
 
-  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,     O,    IV,
-  /* 0A10 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
+  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
   /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
@@ -113,30 +112,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Gujarati */
 
-  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,
-  /* 0A90 */    IV,    IV,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
   /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
   /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0AE0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O,     O,     O,     O,     O,     O,
 
   /* Oriya */
 
-  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 0B10 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
   /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 0B50 */     O,     O,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 0B60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Tamil */
 
-  /* 0B80 */     O,     O, VMAbv,   IND,     O,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,    IV,    IV,
-  /* 0B90 */    IV,     O,    IV,    IV,    IV,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
+  /* 0B80 */     O,     O, VMAbv,   IND,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
   /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
   /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
   /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
@@ -146,41 +145,41 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Telugu */
 
-  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0C10 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,  VAbv,  VAbv,
   /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 0C60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Kannada */
 
-  /* 0C80 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0C90 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C90 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 0CB0 */     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
   /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
-  /* 0CE0 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0CF0 */     O,     R,     R,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Malayalam */
 
-  /* 0D00 */     O, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,    IV,    IV,
-  /* 0D10 */    IV,     O,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,  VPst,  VPst,
   /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
-  /* 0D50 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,    IV,
-  /* 0D60 */    IV,    IV,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,   IND,   IND,   IND,   IND,   IND,   IND,
 
   /* Sinhala */
 
-  /* 0D80 */     O,     O, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 0D90 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,     O,     B,     B,     B,     B,     B,     B,
+  /* 0D80 */     O,     O, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
   /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
   /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
@@ -195,10 +194,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1020 */     B,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
+  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
   /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
   /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,    GB,     O,
-  /* 1050 */     B,     B,    IV,    IV,    IV,    IV,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
+  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
   /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
   /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
@@ -209,30 +208,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Tagalog */
 
-  /* 1700 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
   /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Hanunoo */
 
-  /* 1720 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1730 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Buhid */
 
-  /* 1740 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Tagbanwa */
 
-  /* 1760 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
   /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Khmer */
 
   /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17A0 */     B,     B,     B,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 17B0 */    IV,    IV,    IV,    IV,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
+  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
   /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv,    FM,  FAbv, CMAbv,    FM,    FM,
   /* 17D0 */    FM,  VAbv,     H,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
@@ -274,8 +273,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,    IV,    IV,    IV,
-  /* 1A50 */    IV,    IV,    IV,     B,     B,  MPre,  MBlw,  FPst,  FAbv,  FAbv,  FAbv,  FBlw,  FBlw,  FBlw,  FBlw,     O,
+  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,  FPst,  FAbv,  FAbv,  FAbv,  FBlw,  FBlw,  FBlw,  FBlw,     O,
   /* 1A60 */     H,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
   /* 1A70 */  VPre,  VPre,  VPre,  VAbv,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,    FM,    FM,    FM,     O,     O,    FM,
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
@@ -286,8 +285,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Balinese */
 
-  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 1B10 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
   /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
@@ -297,7 +296,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Sundanese */
 
-  /* 1B80 */ VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
   /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
@@ -306,7 +305,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BE0 */     B,     B,     B,     B,    IV,    IV, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
+  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
   /* 1BF0 */  FAbv,  FAbv,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Lepcha */
@@ -326,14 +325,20 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
   /* 1CF0 */     O,     O, VMPst, VMPst, VMAbv,     O,     O,     O, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x2008u 2552
+#define use_offset_0x1df8u 2552
+
+
+  /* Combining Diacritical Marks Supplement */
+                                                                         O,     O,     O,    FM,     O,     O,     O,     O,
+
+#define use_offset_0x2008u 2560
 
 
   /* General Punctuation */
                                                                          O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
-#define use_offset_0x2060u 2568
+#define use_offset_0x2060u 2576
 
   /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
@@ -342,12 +347,12 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 2070 */     O,     O,     O,     O,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2080 */     O,     O,    FM,    FM,    FM,     O,     O,     O,
 
-#define use_offset_0xa800u 2608
+#define use_offset_0xa800u 2616
 
 
   /* Syloti Nagri */
 
-  /* A800 */    IV,    IV,     O,    IV,    IV,    IV,  VAbv,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
+  /* A800 */     B,     B,     O,     B,     B,     B,  VAbv,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
   /* A810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A820 */     B,     B,     B,  VPst,  VPst,  VBlw,  VAbv,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -361,11 +366,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Saurashtra */
 
-  /* A880 */ VMPst, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* A890 */    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8B0 */     B,     B,     B,     B,  FPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
-  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Devanagari Extended */
@@ -389,7 +394,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Javanese */
 
-  /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,    IV,    IV,    IV,     B,
+  /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,   SUB,  MPst,  MPst,
@@ -403,7 +408,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Cham */
 
-  /* AA00 */    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
   /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -413,7 +418,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* Myanmar Extended-A */
 
   /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA70 */     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
+  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
 
   /* Tai Viet */
 
@@ -426,27 +431,27 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Meetei Mayek Extensions */
 
-  /* AAE0 */    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
+  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
-#define use_offset_0xabc0u 3368
+#define use_offset_0xabc0u 3376
 
 
   /* Meetei Mayek */
 
-  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,    IV,    IV,
-  /* ABD0 */     B,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0xfe00u 3432
+#define use_offset_0xfe00u 3440
 
 
   /* Variation Selectors */
 
   /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
 
-#define use_offset_0x10a00u 3448
+#define use_offset_0x10a00u 3456
 
 
   /* Kharoshthi */
@@ -457,13 +462,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 10A30 */     B,     B,     B,     B,     O,     O,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,
 
-#define use_offset_0x11000u 3520
+#define use_offset_0x11000u 3528
 
 
   /* Brahmi */
 
-  /* 11000 */ VMPst, VMAbv, VMPst,     R,     R,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 11010 */    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11000 */ VMPst, VMAbv, VMPst,     R,     R,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
   /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -473,17 +478,17 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Kaithi */
 
-  /* 11080 */ VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,
+  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11100u 3712
+#define use_offset_0x11100u 3720
 
 
   /* Chakma */
 
-  /* 11100 */ VMAbv, VMAbv, VMAbv,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VAbv,  VAbv,
   /* 11130 */  VAbv,  VBlw,  VBlw,     H,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
@@ -497,8 +502,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Sharada */
 
-  /* 11180 */ VMAbv, VMAbv, VMPst,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,
-  /* 11190 */    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
   /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,     O,     O, CMBlw,  VAbv,  VBlw,     O,     O,     O,
@@ -511,23 +516,23 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Khojki */
 
-  /* 11200 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
-  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,
+  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
-#define use_offset_0x11280u 4024
+#define use_offset_0x11280u 4040
 
 
   /* Multani */
 
-  /* 11280 */    IV,    IV,    IV,    IV,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
+  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
   /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
   /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
 
   /* Khudawadi */
 
-  /* 112B0 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
   /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
@@ -535,44 +540,55 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Grantha */
 
-  /* 11300 */ VMAbv, VMAbv, VMPst, VMPst,     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     O,     O,    IV,
-  /* 11310 */    IV,     O,     O,    IV,    IV,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11300 */ VMAbv, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPst,
   /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11360 */    IV,    IV,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
+  /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
-#define use_offset_0x11480u 4272
+#define use_offset_0x11400u 4288
 
 
+  /* Newa */
+
+  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
+  /* 11440 */  VPst,  VPst,     H, VMAbv, VMAbv, VMPst, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11450 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 11460 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11470 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
   /* Tirhuta */
 
-  /* 11480 */     O,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,
+  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
   /* 114C0 */ VMAbv, VMPst,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11580u 4368
+#define use_offset_0x11580u 4512
 
 
   /* Siddham */
 
-  /* 11580 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,
+  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
   /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
   /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,    IV,    IV,    IV,    IV,  VBlw,  VBlw,     O,     O,
+  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
   /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Modi */
 
-  /* 11600 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,
+  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
@@ -583,7 +599,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Takri */
 
-  /* 11680 */    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,    IV,     B,     B,     B,     B,     B,     B,
+  /* 11680 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11690 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 116A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMPst,  VAbv,  VPre,  VPst,
   /* 116B0 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
@@ -599,7 +615,28 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
-}; /* Table items: 4816; occupancy: 72% */
+#define use_offset_0x11c00u 4960
+
+
+  /* Bhaiksuki */
+
+  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
+  /* 11C40 */     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+
+  /* Marchen */
+
+  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
+
+}; /* Table items: 5144; occupancy: 72% */
 
 USE_TABLE_ELEMENT_TYPE
 hb_use_get_categories (hb_codepoint_t u)
@@ -619,6 +656,7 @@ hb_use_get_categories (hb_codepoint_t u)
       if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
       if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
       if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
       break;
 
     case 0x2u:
@@ -642,10 +680,11 @@ hb_use_get_categories (hb_codepoint_t u)
 
     case 0x11u:
       if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x11237u)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
       if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
-      if (hb_in_range (u, 0x11480u, 0x114DFu)) return use_table[u - 0x11480u + use_offset_0x11480u];
+      if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
       if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+      if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
       if (unlikely (u == 0x1107Fu)) return HN;
       break;
 
@@ -662,7 +701,6 @@ hb_use_get_categories (hb_codepoint_t u)
 #undef H
 #undef HN
 #undef IND
-#undef IV
 #undef N
 #undef O
 #undef R
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
index caacb0caf29..eeca79ae443 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
@@ -184,6 +184,9 @@ has_arabic_joining (hb_script_t script)
     case HB_SCRIPT_MANICHAEAN:
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
+    /* Unicode-9.0 additions */
+    case HB_SCRIPT_ADLAM:
+
       return true;
 
     default:
@@ -227,12 +230,12 @@ data_destroy_use (void *data)
 enum syllable_type_t {
   independent_cluster,
   virama_terminated_cluster,
-  consonant_cluster,
-  vowel_cluster,
+  standard_cluster,
   number_joiner_terminated_cluster,
   numeral_cluster,
   symbol_cluster,
   broken_cluster,
+  non_cluster,
 };
 
 #include "hb-ot-shape-complex-use-machine.hh"
@@ -285,6 +288,9 @@ static void
 setup_topographical_masks (const hb_ot_shape_plan_t *plan,
                            hb_buffer_t *buffer)
 {
+  const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+  if (use_plan->arabic_plan)
+    return;
 
   ASSERT_STATIC (INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4);
   hb_mask_t masks[4], all_masks = 0;
@@ -309,13 +315,13 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
     {
       case independent_cluster:
       case symbol_cluster:
+      case non_cluster:
         /* These don't join.  Nothing to do. */
         last_form = _NONE;
         break;
 
       case virama_terminated_cluster:
-      case consonant_cluster:
-      case vowel_cluster:
+      case standard_cluster:
       case number_joiner_terminated_cluster:
       case numeral_cluster:
       case broken_cluster:
@@ -360,7 +366,7 @@ clear_substitution_flags (const hb_ot_shape_plan_t *plan,
   hb_glyph_info_t *info = buffer->info;
   unsigned int count = buffer->len;
   for (unsigned int i = 0; i < count; i++)
-    _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (&info[i]);
+    _hb_glyph_info_clear_substituted (&info[i]);
 }
 
 static void
@@ -405,6 +411,12 @@ record_pref (const hb_ot_shape_plan_t *plan,
   }
 }
 
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+  return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info);
+}
+
 static void
 reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
 {
@@ -412,28 +424,26 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
   /* Only a few syllable types need reordering. */
   if (unlikely (!(FLAG_SAFE (syllable_type) &
                   (FLAG (virama_terminated_cluster) |
-                   FLAG (consonant_cluster) |
-                   FLAG (vowel_cluster) |
+                   FLAG (standard_cluster) |
                    FLAG (broken_cluster) |
                    0))))
     return;
 
   hb_glyph_info_t *info = buffer->info;
 
-#define HALANT_FLAGS FLAG(USE_H)
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
+#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
 
   /* Move things forward. */
   if (info[start].use_category() == USE_R && end - start > 1)
   {
     /* Got a repha.  Reorder it to after first base, before first halant. */
     for (unsigned int i = start + 1; i < end; i++)
-      if (FLAG_UNSAFE (info[i].use_category()) & (HALANT_FLAGS | BASE_FLAGS))
+      if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
       {
         /* If we hit a halant, move before it; otherwise it's a base: move to it's
          * place, and shift things in between backward. */
 
-        if (info[i].use_category() == USE_H)
+        if (is_halant (info[i]))
           i--;
 
         buffer->merge_clusters (start, i + 1);
@@ -450,11 +460,11 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
   for (unsigned int i = start; i < end; i++)
   {
     uint32_t flag = FLAG_UNSAFE (info[i].use_category());
-    if (flag & (HALANT_FLAGS | BASE_FLAGS))
+    if ((flag & (BASE_FLAGS)) || is_halant (info[i]))
     {
-      /* If we hit a halant, move before it; otherwise it's a base: move to it's
+      /* If we hit a halant, move after it; otherwise it's a base: move to it's
        * place, and shift things in between backward. */
-      if (info[i].use_category() == USE_H)
+      if (is_halant (info[i]))
         j = i + 1;
       else
         j = i;
@@ -490,22 +500,16 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
   if (likely (!has_broken_syllables))
     return;
 
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
-    return;
-
   hb_glyph_info_t dottedcircle = {0};
-  if (!font->get_glyph (0x25CCu, 0, &dottedcircle.codepoint))
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
     return;
   dottedcircle.use_category() = hb_use_get_categories (0x25CC);
 
   buffer->clear_output ();
 
   buffer->idx = 0;
-
   unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len)
+  while (buffer->idx < buffer->len && !buffer->in_error)
   {
     unsigned int syllable = buffer->cur().syllable();
     syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -513,19 +517,19 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
     {
       last_syllable = syllable;
 
-      hb_glyph_info_t info = dottedcircle;
-      info.cluster = buffer->cur().cluster;
-      info.mask = buffer->cur().mask;
-      info.syllable() = buffer->cur().syllable();
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
       /* TODO Set glyph_props? */
 
       /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len &&
+      while (buffer->idx < buffer->len && !buffer->in_error &&
              last_syllable == buffer->cur().syllable() &&
              buffer->cur().use_category() == USE_R)
         buffer->next_glyph ();
 
-      buffer->output_info (info);
+      buffer->output_info (ginfo);
     }
     else
       buffer->next_glyph ();
@@ -564,7 +568,7 @@ compose_use (const hb_ot_shape_normalize_context_t *c,
   if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
     return false;
 
-  return c->unicode->compose (a, b, ab);
+  return (bool)c->unicode->compose (a, b, ab);
 }
 
 
@@ -576,10 +580,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
   data_create_use,
   data_destroy_use,
   NULL, /* preprocess_text */
+  NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   NULL, /* decompose */
   compose_use,
   setup_masks_use,
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
index 2f52d857198..f9fe50491ac 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
@@ -45,5 +45,9 @@ HB_INTERNAL void _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
                                              hb_font_t *font,
                                              hb_buffer_t  *buffer);
 
+HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+                                               hb_font_t *font,
+                                               hb_buffer_t  *buffer);
+
 
 #endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
index 6b9c9ac8594..baa383501f6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
@@ -224,7 +224,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
         pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
         break;
       }
-      /* Fall through */
+      HB_FALLTHROUGH;
 
     default:
     case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -259,6 +259,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
     case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
       /* Add gap, fall-through. */
       base_extents.height -= y_gap;
+      HB_FALLTHROUGH;
 
     case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
     case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -279,6 +280,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
       /* Add gap, fall-through. */
       base_extents.y_bearing += y_gap;
       base_extents.height -= y_gap;
+      HB_FALLTHROUGH;
 
     case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
     case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
@@ -482,3 +484,70 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
     idx = skippy_iter.idx;
   }
 }
+
+
+/* Adjusts width of various spaces. */
+void
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+                              hb_font_t *font,
+                              hb_buffer_t  *buffer)
+{
+  if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+    return;
+
+  hb_glyph_info_t *info = buffer->info;
+  hb_glyph_position_t *pos = buffer->pos;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
+    {
+      hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
+      hb_codepoint_t glyph;
+      typedef hb_unicode_funcs_t t;
+      switch (space_type)
+      {
+        case t::NOT_SPACE: /* Shouldn't happen. */
+        case t::SPACE:
+          break;
+
+        case t::SPACE_EM:
+        case t::SPACE_EM_2:
+        case t::SPACE_EM_3:
+        case t::SPACE_EM_4:
+        case t::SPACE_EM_5:
+        case t::SPACE_EM_6:
+        case t::SPACE_EM_16:
+          pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type;
+          break;
+
+        case t::SPACE_4_EM_18:
+          pos[i].x_advance = font->x_scale * 4 / 18;
+          break;
+
+        case t::SPACE_FIGURE:
+          for (char u = '0'; u <= '9'; u++)
+            if (font->get_nominal_glyph (u, &glyph))
+            {
+              pos[i].x_advance = font->get_glyph_h_advance (glyph);
+              break;
+            }
+          break;
+
+        case t::SPACE_PUNCTUATION:
+          if (font->get_nominal_glyph ('.', &glyph))
+            pos[i].x_advance = font->get_glyph_h_advance (glyph);
+          else if (font->get_nominal_glyph (',', &glyph))
+            pos[i].x_advance = font->get_glyph_h_advance (glyph);
+          break;
+
+        case t::SPACE_NARROW:
+          /* Half-space?
+           * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
+           * However, in my testing, many fonts have their regular space being about that
+           * size.  To me, a percentage of the space width makes more sense.  Half is as
+           * good as any. */
+          pos[i].x_advance /= 2;
+          break;
+      }
+    }
+}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
index b0c027aebaa..6bba43b1693 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
@@ -62,24 +62,12 @@
  *     with previous base, use that.  This needs the itemizer to have this
  *     knowledge too.  We need to provide assistance to the itemizer.
  *
- *   - When a font does not support a character but supports its decomposition,
- *     well, use the decomposition (preferring the canonical decomposition, but
- *     falling back to the compatibility decomposition if necessary).  The
- *     compatibility decomposition is really nice to have, for characters like
- *     ellipsis, or various-sized space characters.
+ *   - When a font does not support a character but supports its canonical
+ *     decomposition, well, use the decomposition.
  *
  *   - The complex shapers can customize the compose and decompose functions to
  *     offload some of their requirements to the normalizer.  For example, the
  *     Indic shaper may want to disallow recomposing of two matras.
- *
- *   - We try compatibility decomposition if decomposing through canonical
- *     decomposition alone failed to find a sequence that the font supports.
- *     We don't try compatibility decomposition recursively during the canonical
- *     decomposition phase.  This has minimal impact.  There are only a handful
- *     of Greek letter that have canonical decompositions that include characters
- *     with compatibility decomposition.  Those can be found using this command:
- *
- *     egrep  "`echo -n ';('; grep ';<' UnicodeData.txt | cut -d';' -f1 | tr '\n' '|'; echo ') '`" UnicodeData.txt
  */
 
 static bool
@@ -88,7 +76,7 @@ decompose_unicode (const hb_ot_shape_normalize_context_t *c,
                    hb_codepoint_t *a,
                    hb_codepoint_t *b)
 {
-  return c->unicode->decompose (ab, a, b);
+  return (bool) c->unicode->decompose (ab, a, b);
 }
 
 static bool
@@ -97,21 +85,21 @@ compose_unicode (const hb_ot_shape_normalize_context_t *c,
                  hb_codepoint_t  b,
                  hb_codepoint_t *ab)
 {
-  return c->unicode->compose (a, b, ab);
+  return (bool) c->unicode->compose (a, b, ab);
 }
 
 static inline void
 set_glyph (hb_glyph_info_t &info, hb_font_t *font)
 {
-  font->get_glyph (info.codepoint, 0, &info.glyph_index());
+  font->get_nominal_glyph (info.codepoint, &info.glyph_index());
 }
 
 static inline void
 output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
 {
   buffer->cur().glyph_index() = glyph;
-  buffer->output_glyph (unichar);
-  _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer->unicode);
+  buffer->output_glyph (unichar); /* This is very confusing indeed. */
+  _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
 }
 
 static inline void
@@ -136,10 +124,10 @@ decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
   hb_font_t * const font = c->font;
 
   if (!c->decompose (c, ab, &a, &b) ||
-      (b && !font->get_glyph (b, 0, &b_glyph)))
+      (b && !font->get_nominal_glyph (b, &b_glyph)))
     return 0;
 
-  bool has_a = font->get_glyph (a, 0, &a_glyph);
+  bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph);
   if (shortest && has_a) {
     /* Output a and b */
     output_char (buffer, a, a_glyph);
@@ -171,28 +159,6 @@ decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
   return 0;
 }
 
-/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
-static inline unsigned int
-decompose_compatibility (const hb_ot_shape_normalize_context_t *c, hb_codepoint_t u)
-{
-  unsigned int len, i;
-  hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
-  hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN];
-
-  len = c->buffer->unicode->decompose_compatibility (u, decomposed);
-  if (!len)
-    return 0;
-
-  for (i = 0; i < len; i++)
-    if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i]))
-      return 0;
-
-  for (i = 0; i < len; i++)
-    output_char (c->buffer, decomposed[i], glyphs[i]);
-
-  return len;
-}
-
 static inline void
 decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
 {
@@ -200,17 +166,50 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
   hb_codepoint_t u = buffer->cur().codepoint;
   hb_codepoint_t glyph;
 
-  /* Kind of a cute waterfall here... */
-  if (shortest && c->font->get_glyph (u, 0, &glyph))
+  if (shortest && c->font->get_nominal_glyph (u, &glyph))
+  {
     next_char (buffer, glyph);
-  else if (decompose (c, shortest, u))
+    return;
+  }
+
+  if (decompose (c, shortest, u))
+  {
     skip_char (buffer);
-  else if (!shortest && c->font->get_glyph (u, 0, &glyph))
+    return;
+  }
+
+  if (!shortest && c->font->get_nominal_glyph (u, &glyph))
+  {
     next_char (buffer, glyph);
-  else if (decompose_compatibility (c, u))
-    skip_char (buffer);
-  else
-    next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
+    return;
+  }
+
+  if (_hb_glyph_info_is_unicode_space (&buffer->cur()))
+  {
+    hb_codepoint_t space_glyph;
+    hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
+    if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph))
+    {
+      _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
+      next_char (buffer, space_glyph);
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK;
+      return;
+    }
+  }
+
+  if (u == 0x2011u)
+  {
+    /* U+2011 is the only sensible character that is a no-break version of another character
+     * and not a space.  The space ones are handled already.  Handle this lone one. */
+    hb_codepoint_t other_glyph;
+    if (c->font->get_nominal_glyph (0x2010u, &other_glyph))
+    {
+      next_char (buffer, other_glyph);
+      return;
+    }
+  }
+
+  next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
 }
 
 static inline void
@@ -219,10 +218,10 @@ handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, uns
   /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
   hb_buffer_t * const buffer = c->buffer;
   hb_font_t * const font = c->font;
-  for (; buffer->idx < end - 1;) {
+  for (; buffer->idx < end - 1 && !buffer->in_error;) {
     if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
       /* The next two lines are some ugly lines... But work. */
-      if (font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
+      if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
       {
         buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
       }
@@ -255,13 +254,13 @@ static inline void
 decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
 {
   hb_buffer_t * const buffer = c->buffer;
-  for (unsigned int i = buffer->idx; i < end; i++)
+  for (unsigned int i = buffer->idx; i < end && !buffer->in_error; i++)
     if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
       handle_variation_selector_cluster (c, end, short_circuit);
       return;
     }
 
-  while (buffer->idx < end)
+  while (buffer->idx < end && !buffer->in_error)
     decompose_current_character (c, short_circuit);
 }
 
@@ -321,7 +320,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
 
   buffer->clear_output ();
   count = buffer->len;
-  for (buffer->idx = 0; buffer->idx < count;)
+  for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
   {
     unsigned int end;
     for (end = buffer->idx + 1; end < count; end++)
@@ -371,7 +370,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
   count = buffer->len;
   unsigned int starter = 0;
   buffer->next_glyph ();
-  while (buffer->idx < count)
+  while (buffer->idx < count && !buffer->in_error)
   {
     hb_codepoint_t composed, glyph;
     if (/* We don't try to compose a non-mark character with it's preceding starter.
@@ -389,7 +388,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
                    buffer->cur().codepoint,
                    &composed) &&
         /* And the font has glyph for the composite. */
-        font->get_glyph (composed, 0, &glyph))
+        font->get_nominal_glyph (composed, &glyph))
     {
       /* Composes. */
       buffer->next_glyph (); /* Copy to out-buffer. */
@@ -400,7 +399,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
       /* Modify starter and carry on. */
       buffer->out_info[starter].codepoint = composed;
       buffer->out_info[starter].glyph_index() = glyph;
-      _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer->unicode);
+      _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
 
       continue;
     }
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
index a8888458753..35f2097d7ec 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
@@ -145,7 +145,7 @@ _hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
 struct hb_ot_shaper_font_data_t {};
 
 hb_ot_shaper_font_data_t *
-_hb_ot_shaper_font_data_create (hb_font_t *font)
+_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED)
 {
   return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
@@ -228,7 +228,7 @@ hb_set_unicode_props (hb_buffer_t *buffer)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
-    _hb_glyph_info_set_unicode_props (&info[i], buffer->unicode);
+    _hb_glyph_info_set_unicode_props (&info[i], buffer);
 }
 
 static void
@@ -245,7 +245,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
 
   hb_glyph_info_t dottedcircle = {0};
   dottedcircle.codepoint = 0x25CCu;
-  _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode);
+  _hb_glyph_info_set_unicode_props (&dottedcircle, buffer);
 
   buffer->clear_output ();
 
@@ -254,7 +254,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
   info.cluster = buffer->cur().cluster;
   info.mask = buffer->cur().mask;
   buffer->output_info (info);
-  while (buffer->idx < buffer->len)
+  while (buffer->idx < buffer->len && !buffer->in_error)
     buffer->next_glyph ();
 
   buffer->swap_buffers ();
@@ -263,16 +263,18 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
 static void
 hb_form_clusters (hb_buffer_t *buffer)
 {
-  if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+      buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
     return;
 
-  /* Loop duplicated in hb_ensure_native_direction(). */
+  /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
   unsigned int base = 0;
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 1; i < count; i++)
   {
-    if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i]))))
+    if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
+                !_hb_glyph_info_is_joiner (&info[i])))
     {
       buffer->merge_clusters (base, i);
       base = i;
@@ -346,7 +348,8 @@ hb_ot_mirror_chars (hb_ot_shape_context_t *c)
 static inline void
 hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
 {
-  if (!c->plan->has_frac)
+  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+      !c->plan->has_frac)
     return;
 
   hb_buffer_t *buffer = c->buffer;
@@ -416,7 +419,8 @@ hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
-  if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
     return;
 
   unsigned int count = buffer->len;
@@ -433,7 +437,8 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
-  if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
     return;
 
   unsigned int count = buffer->len;
@@ -451,7 +456,7 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
     return;
 
   hb_codepoint_t space;
-  if (c->font->get_glyph (' ', 0, &space))
+  if (c->font->get_nominal_glyph (' ', &space))
   {
     /* Replace default-ignorables with a zero-advance space glyph. */
     for (/*continue*/; i < count; i++)
@@ -518,40 +523,11 @@ hb_ot_map_glyphs_fast (hb_buffer_t  *buffer)
   buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
 }
 
-static inline void
-hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
-{
-  unsigned int count = c->buffer->len;
-  hb_glyph_info_t *info = c->buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-  {
-    hb_ot_layout_glyph_class_mask_t klass;
-
-    /* Never mark default-ignorables as marks.
-     * They won't get in the way of lookups anyway,
-     * but having them as mark will cause them to be skipped
-     * over if the lookup-flag says so, but at least for the
-     * Mongolian variation selectors, looks like Uniscribe
-     * marks them as non-mark.  Some Mongolian fonts without
-     * GDEF rely on this.  Another notable character that
-     * this applies to is COMBINING GRAPHEME JOINER. */
-    klass = (_hb_glyph_info_get_general_category (&info[i]) !=
-             HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
-             _hb_glyph_info_is_default_ignorable (&info[i])) ?
-            HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
-            HB_OT_LAYOUT_GLYPH_PROPS_MARK;
-    _hb_glyph_info_set_glyph_props (&info[i], klass);
-  }
-}
-
 static inline void
 hb_ot_substitute_default (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
-  if (c->plan->shaper->preprocess_text)
-    c->plan->shaper->preprocess_text (c->plan, buffer, c->font);
-
   hb_ot_shape_initialize_masks (c);
 
   hb_ot_mirror_chars (c);
@@ -576,16 +552,10 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
-  _hb_buffer_allocate_gsubgpos_vars (buffer);
   hb_ot_layout_substitute_start (c->font, buffer);
 
-  if (!hb_ot_layout_has_glyph_classes (c->face))
-    hb_synthesize_glyph_classes (c);
-
   c->plan->substitute (c->font, buffer);
 
-  hb_ot_layout_substitute_finish (c->font, buffer);
-
   return;
 }
 
@@ -593,6 +563,9 @@ static inline void
 hb_ot_substitute (hb_ot_shape_context_t *c)
 {
   hb_ot_substitute_default (c);
+
+  _hb_buffer_allocate_gsubgpos_vars (c->buffer);
+
   hb_ot_substitute_complex (c);
 }
 
@@ -612,20 +585,6 @@ zero_mark_width (hb_glyph_position_t *pos)
   pos->y_advance = 0;
 }
 
-static inline void
-zero_mark_widths_by_unicode (hb_buffer_t *buffer, bool adjust_offsets)
-{
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
-    {
-      if (adjust_offsets)
-        adjust_mark_offsets (&buffer->pos[i]);
-      zero_mark_width (&buffer->pos[i]);
-    }
-}
-
 static inline void
 zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets)
 {
@@ -647,26 +606,41 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
   unsigned int count = c->buffer->len;
   hb_glyph_info_t *info = c->buffer->info;
   hb_glyph_position_t *pos = c->buffer->pos;
-  for (unsigned int i = 0; i < count; i++)
-  {
-    c->font->get_glyph_advance_for_direction (info[i].codepoint,
-                                              direction,
-                                              &pos[i].x_advance,
-                                              &pos[i].y_advance);
-    c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
-                                                  direction,
-                                                  &pos[i].x_offset,
-                                                  &pos[i].y_offset);
 
+  if (HB_DIRECTION_IS_HORIZONTAL (direction))
+  {
+    for (unsigned int i = 0; i < count; i++)
+      pos[i].x_advance = c->font->get_glyph_h_advance (info[i].codepoint);
+    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+    if (c->font->has_glyph_h_origin_func ())
+      for (unsigned int i = 0; i < count; i++)
+        c->font->subtract_glyph_h_origin (info[i].codepoint,
+                                          &pos[i].x_offset,
+                                          &pos[i].y_offset);
   }
+  else
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      pos[i].y_advance = c->font->get_glyph_v_advance (info[i].codepoint);
+      c->font->subtract_glyph_v_origin (info[i].codepoint,
+                                        &pos[i].x_offset,
+                                        &pos[i].y_offset);
+    }
+  }
+  if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
+    _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
 }
 
 static inline bool
 hb_ot_position_complex (hb_ot_shape_context_t *c)
 {
+  hb_ot_layout_position_start (c->font, c->buffer);
+
   bool ret = false;
   unsigned int count = c->buffer->len;
-  bool has_positioning = hb_ot_layout_has_positioning (c->face);
+  bool has_positioning = (bool) hb_ot_layout_has_positioning (c->face);
+
   /* If the font has no GPOS, AND, no fallback positioning will
    * happen, AND, direction is forward, then when zeroing mark
    * widths, we shift the mark with it, such that the mark
@@ -685,15 +659,8 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
       zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
       break;
 
-    /* Not currently used for any shaper:
-    case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
-      zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
-      break;
-    */
-
     default:
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
-    case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
       break;
   }
@@ -703,60 +670,56 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
     hb_glyph_info_t *info = c->buffer->info;
     hb_glyph_position_t *pos = c->buffer->pos;
 
-    /* Change glyph origin to what GPOS expects, apply GPOS, change it back. */
+    /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
 
-    for (unsigned int i = 0; i < count; i++) {
-      c->font->add_glyph_origin_for_direction (info[i].codepoint,
-                                               HB_DIRECTION_LTR,
-                                               &pos[i].x_offset,
-                                               &pos[i].y_offset);
-    }
+    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+    if (c->font->has_glyph_h_origin_func ())
+      for (unsigned int i = 0; i < count; i++)
+        c->font->add_glyph_h_origin (info[i].codepoint,
+                                     &pos[i].x_offset,
+                                     &pos[i].y_offset);
 
     c->plan->position (c->font, c->buffer);
 
-    for (unsigned int i = 0; i < count; i++) {
-      c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
-                                                    HB_DIRECTION_LTR,
-                                                    &pos[i].x_offset,
-                                                    &pos[i].y_offset);
-    }
+    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+    if (c->font->has_glyph_h_origin_func ())
+      for (unsigned int i = 0; i < count; i++)
+        c->font->subtract_glyph_h_origin (info[i].codepoint,
+                                          &pos[i].x_offset,
+                                          &pos[i].y_offset);
 
     ret = true;
   }
 
   switch (c->plan->shaper->zero_width_marks)
   {
-    case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
-      zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
-      break;
-
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
       zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
       break;
 
     default:
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
-    //case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
       break;
   }
 
+  /* Finishing off GPOS has to follow a certain order. */
+  hb_ot_layout_position_finish_advances (c->font, c->buffer);
+  hb_ot_zero_width_default_ignorables (c);
+  hb_ot_layout_position_finish_offsets (c->font, c->buffer);
+
   return ret;
 }
 
 static inline void
 hb_ot_position (hb_ot_shape_context_t *c)
 {
-  hb_ot_layout_position_start (c->font, c->buffer);
+  c->buffer->clear_positions ();
 
   hb_ot_position_default (c);
 
   hb_bool_t fallback = !hb_ot_position_complex (c);
 
-  hb_ot_zero_width_default_ignorables (c);
-
-  hb_ot_layout_position_finish (c->font, c->buffer);
-
   if (fallback && c->plan->shaper->fallback_position)
     _hb_ot_shape_fallback_position (c->plan, c->font, c->buffer);
 
@@ -778,6 +741,12 @@ static void
 hb_ot_shape_internal (hb_ot_shape_context_t *c)
 {
   c->buffer->deallocate_var_all ();
+  c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+  if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR)))
+  {
+    c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR,
+                              (unsigned) HB_BUFFER_MAX_LEN_MIN);
+  }
 
   /* Save the original direction, we use it later. */
   c->target_direction = c->buffer->props.direction;
@@ -792,15 +761,22 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 
   hb_ensure_native_direction (c->buffer);
 
+  if (c->plan->shaper->preprocess_text)
+    c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+
   hb_ot_substitute (c);
   hb_ot_position (c);
 
   hb_ot_hide_default_ignorables (c);
 
+  if (c->plan->shaper->postprocess_glyphs)
+    c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+
   _hb_buffer_deallocate_unicode_vars (c->buffer);
 
   c->buffer->props.direction = c->target_direction;
 
+  c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
   c->buffer->deallocate_var_all ();
 }
 
@@ -820,6 +796,8 @@ _hb_ot_shape (hb_shape_plan_t    *shape_plan,
 
 
 /**
+ * hb_ot_shape_plan_collect_lookups:
+ *
  * Since: 0.9.7
  **/
 void
@@ -841,18 +819,20 @@ add_char (hb_font_t          *font,
           hb_set_t           *glyphs)
 {
   hb_codepoint_t glyph;
-  if (font->get_glyph (u, 0, &glyph))
+  if (font->get_nominal_glyph (u, &glyph))
     glyphs->add (glyph);
   if (mirror)
   {
     hb_codepoint_t m = unicode->mirroring (u);
-    if (m != u && font->get_glyph (m, 0, &glyph))
+    if (m != u && font->get_nominal_glyph (m, &glyph))
       glyphs->add (glyph);
   }
 }
 
 
 /**
+ * hb_ot_shape_glyphs_closure:
+ *
  * Since: 0.9.2
  **/
 void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
index a64920d2bb3..0f38b556ebc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
@@ -36,14 +36,14 @@
 HB_BEGIN_DECLS
 
 /* TODO port to shape-plan / set. */
-void
+HB_EXTERN void
 hb_ot_shape_glyphs_closure (hb_font_t          *font,
                             hb_buffer_t        *buffer,
                             const hb_feature_t *features,
                             unsigned int        num_features,
                             hb_set_t           *glyphs);
 
-void
+HB_EXTERN void
 hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
                                   hb_tag_t         table_tag,
                                   hb_set_t        *lookup_indexes /* OUT */);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
index ef9d32e930e..c790888d4c3 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
@@ -186,14 +186,18 @@ static const LangTag ot_languages[] = {
   {"aa",        HB_TAG('A','F','R',' ')},       /* Afar */
   {"ab",        HB_TAG('A','B','K',' ')},       /* Abkhazian */
   {"abq",       HB_TAG('A','B','A',' ')},       /* Abaza */
+  {"acf",       HB_TAG('F','A','N',' ')},       /* French Antillean */
   {"ach",       HB_TAG('A','C','H',' ')},       /* Acoli */
+  {"acr",       HB_TAG('A','C','R',' ')},       /* Achi */
   {"ada",       HB_TAG('D','N','G',' ')},       /* Dangme */
   {"ady",       HB_TAG('A','D','Y',' ')},       /* Adyghe */
   {"af",        HB_TAG('A','F','K',' ')},       /* Afrikaans */
+  {"ahg",       HB_TAG('A','G','W',' ')},       /* Agaw */
   {"aii",       HB_TAG('S','W','A',' ')},       /* Swadaya Aramaic */
   {"aio",       HB_TAG('A','I','O',' ')},       /* Aiton */
   {"aiw",       HB_TAG('A','R','I',' ')},       /* Aari */
   {"ak",        HB_TAG('T','W','I',' ')},       /* Akan [macrolanguage] */
+  {"aka",       HB_TAG('A','K','A',' ')},       /* Akan */
   {"alt",       HB_TAG('A','L','T',' ')},       /* [Southern] Altai */
   {"am",        HB_TAG('A','M','H',' ')},       /* Amharic */
   {"amf",       HB_TAG('H','B','N',' ')},       /* Hammer-Banna */
@@ -206,6 +210,7 @@ static const LangTag ot_languages[] = {
   {"as",        HB_TAG('A','S','M',' ')},       /* Assamese */
   {"ast",       HB_TAG('A','S','T',' ')},       /* Asturian/Asturleonese/Bable/Leonese */
   {"ath",       HB_TAG('A','T','H',' ')},       /* Athapaskan [family] */
+  {"atj",       HB_TAG('R','C','R',' ')},       /* R-Cree */
   {"atv",       HB_TAG('A','L','T',' ')},       /* [Northern] Altai */
   {"av",        HB_TAG('A','V','R',' ')},       /* Avaric */
   {"awa",       HB_TAG('A','W','A',' ')},       /* Awadhi */
@@ -214,6 +219,7 @@ static const LangTag ot_languages[] = {
   {"azb",       HB_TAG('A','Z','B',' ')},       /* South Azerbaijani */
   {"azj",       HB_TAG('A','Z','E',' ')},       /* North Azerbaijani */
   {"ba",        HB_TAG('B','S','H',' ')},       /* Bashkir */
+  {"bad",       HB_TAG('B','A','D','0')},       /* Banda */
   {"bai",       HB_TAG('B','M','L',' ')},       /* Bamileke [family] */
   {"bal",       HB_TAG('B','L','I',' ')},       /* Baluchi [macrolangauge] */
   {"ban",       HB_TAG('B','A','N',' ')},       /* Balinese */
@@ -222,11 +228,13 @@ static const LangTag ot_languages[] = {
   {"bci",       HB_TAG('B','A','U',' ')},       /* Baoulé */
   {"bcl",       HB_TAG('B','I','K',' ')},       /* Central Bikol */
   {"bcq",       HB_TAG('B','C','H',' ')},       /* Bench */
+  {"bdy",       HB_TAG('B','D','Y',' ')},       /* Bandjalang */
   {"be",        HB_TAG('B','E','L',' ')},       /* Belarusian */
   {"bem",       HB_TAG('B','E','M',' ')},       /* Bemba (Zambia) */
   {"ber",       HB_TAG('B','E','R',' ')},       /* Berber [family] */
   {"bfq",       HB_TAG('B','A','D',' ')},       /* Badaga */
   {"bft",       HB_TAG('B','L','T',' ')},       /* Balti */
+  {"bfu",       HB_TAG('L','A','H',' ')},       /* Lahuli */
   {"bfy",       HB_TAG('B','A','G',' ')},       /* Baghelkhandi */
   {"bg",        HB_TAG('B','G','R',' ')},       /* Bulgarian */
   {"bgc",       HB_TAG('B','G','C',' ')},       /* Haryanvi */
@@ -260,11 +268,13 @@ static const LangTag ot_languages[] = {
   {"bxr",       HB_TAG('R','B','U',' ')},       /* Russian Buriat */
   {"byn",       HB_TAG('B','I','L',' ')},       /* Bilen */
   {"ca",        HB_TAG('C','A','T',' ')},       /* Catalan */
+  {"cak",       HB_TAG('C','A','K',' ')},       /* Kaqchikel */
   {"cbk",       HB_TAG('C','B','K',' ')},       /* Chavacano */
   {"ce",        HB_TAG('C','H','E',' ')},       /* Chechen */
   {"ceb",       HB_TAG('C','E','B',' ')},       /* Cebuano */
   {"cgg",       HB_TAG('C','G','G',' ')},       /* Chiga */
   {"ch",        HB_TAG('C','H','A',' ')},       /* Chamorro */
+  {"chk",       HB_TAG('C','H','K','0')},       /* Chuukese */
   {"cho",       HB_TAG('C','H','O',' ')},       /* Choctaw */
   {"chp",       HB_TAG('C','H','P',' ')},       /* Chipewyan */
   {"chr",       HB_TAG('C','H','R',' ')},       /* Cherokee */
@@ -272,9 +282,12 @@ static const LangTag ot_languages[] = {
   {"ckb",       HB_TAG('K','U','R',' ')},       /* Central Kurdish (Sorani) */
   {"ckt",       HB_TAG('C','H','K',' ')},       /* Chukchi */
   {"cop",       HB_TAG('C','O','P',' ')},       /* Coptic */
+  {"cpp",       HB_TAG('C','P','P',' ')},       /* Creoles */
   {"cr",        HB_TAG('C','R','E',' ')},       /* Cree */
+  {"cre",       HB_TAG('Y','C','R',' ')},       /* Y-Cree */
   {"crh",       HB_TAG('C','R','T',' ')},       /* Crimean Tatar */
   {"crj",       HB_TAG('E','C','R',' ')},       /* [Southern] East Cree */
+  {"crk",       HB_TAG('W','C','R',' ')},       /* West-Cree */
   {"crl",       HB_TAG('E','C','R',' ')},       /* [Northern] East Cree */
   {"crm",       HB_TAG('M','C','R',' ')},       /* Moose Cree */
   {"crx",       HB_TAG('C','R','R',' ')},       /* Carrier */
@@ -283,21 +296,27 @@ static const LangTag ot_languages[] = {
   {"ctg",       HB_TAG('C','T','G',' ')},       /* Chittagonian */
   {"cts",       HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol */
   {"cu",        HB_TAG('C','S','L',' ')},       /* Church Slavic */
+  {"cuk",       HB_TAG('C','U','K',' ')},       /* San Blas Kuna */
   {"cv",        HB_TAG('C','H','U',' ')},       /* Chuvash */
   {"cwd",       HB_TAG('D','C','R',' ')},       /* Woods Cree */
   {"cy",        HB_TAG('W','E','L',' ')},       /* Welsh */
   {"da",        HB_TAG('D','A','N',' ')},       /* Danish */
   {"dap",       HB_TAG('N','I','S',' ')},       /* Nisi (India) */
   {"dar",       HB_TAG('D','A','R',' ')},       /* Dargwa */
+  {"dax",       HB_TAG('D','A','X',' ')},       /* Dayi */
   {"de",        HB_TAG('D','E','U',' ')},       /* German */
   {"dgo",       HB_TAG('D','G','O',' ')},       /* Dogri */
   {"dhd",       HB_TAG('M','A','W',' ')},       /* Dhundari */
+  {"dhg",       HB_TAG('D','H','G',' ')},       /* Dhangu */
   {"din",       HB_TAG('D','N','K',' ')},       /* Dinka [macrolanguage] */
   {"diq",       HB_TAG('D','I','Q',' ')},       /* Dimli */
   {"dje",       HB_TAG('D','J','R',' ')},       /* Zarma */
+  {"djr",       HB_TAG('D','J','R','0')},       /* Djambarrpuyngu */
   {"dng",       HB_TAG('D','U','N',' ')},       /* Dungan */
+  {"dnj",       HB_TAG('D','N','J',' ')},       /* Dan */
   {"doi",       HB_TAG('D','G','R',' ')},       /* Dogri [macrolanguage] */
   {"dsb",       HB_TAG('L','S','B',' ')},       /* Lower Sorbian */
+  {"duj",       HB_TAG('D','U','J',' ')},       /* Dhuwal */
   {"dv",        HB_TAG('D','I','V',' ')},       /* Dhivehi/Divehi/Maldivian */
   {"dyu",       HB_TAG('J','U','L',' ')},       /* Jula */
   {"dz",        HB_TAG('D','Z','N',' ')},       /* Dzongkha */
@@ -307,23 +326,30 @@ static const LangTag ot_languages[] = {
   {"el",        HB_TAG('E','L','L',' ')},       /* Modern Greek (1453-) */
   {"emk",       HB_TAG('M','N','K',' ')},       /* Eastern Maninkakan */
   {"en",        HB_TAG('E','N','G',' ')},       /* English */
+  {"enf",       HB_TAG('F','N','E',' ')},       /* Forest Nenets */
+  {"enh",       HB_TAG('T','N','E',' ')},       /* Tundra Nenets */
   {"eo",        HB_TAG('N','T','O',' ')},       /* Esperanto */
   {"eot",       HB_TAG('B','T','I',' ')},       /* Beti (Côte d'Ivoire) */
   {"es",        HB_TAG('E','S','P',' ')},       /* Spanish */
+  {"esu",       HB_TAG('E','S','U',' ')},       /* Central Yupik */
   {"et",        HB_TAG('E','T','I',' ')},       /* Estonian [macrolanguage] */
   {"eu",        HB_TAG('E','U','Q',' ')},       /* Basque */
   {"eve",       HB_TAG('E','V','N',' ')},       /* Even */
   {"evn",       HB_TAG('E','V','K',' ')},       /* Evenki */
   {"fa",        HB_TAG('F','A','R',' ')},       /* Persian [macrolanguage] */
+  {"fan",       HB_TAG('F','A','N','0')},       /* Fang */
+  {"fat",       HB_TAG('F','A','T',' ')},       /* Fanti */
   {"ff",        HB_TAG('F','U','L',' ')},       /* Fulah [macrolanguage] */
   {"fi",        HB_TAG('F','I','N',' ')},       /* Finnish */
   {"fil",       HB_TAG('P','I','L',' ')},       /* Filipino */
   {"fj",        HB_TAG('F','J','I',' ')},       /* Fijian */
+  {"flm",       HB_TAG('H','A','L',' ')},       /* Halam */
   {"fo",        HB_TAG('F','O','S',' ')},       /* Faroese */
   {"fon",       HB_TAG('F','O','N',' ')},       /* Fon */
   {"fr",        HB_TAG('F','R','A',' ')},       /* French */
   {"frc",       HB_TAG('F','R','C',' ')},       /* Cajun French */
   {"frp",       HB_TAG('F','R','P',' ')},       /* Arpitan/Francoprovençal */
+  {"fuf",       HB_TAG('F','T','A',' ')},       /* Futa */
   {"fur",       HB_TAG('F','R','L',' ')},       /* Friulian */
   {"fuv",       HB_TAG('F','U','V',' ')},       /* Nigerian Fulfulde */
   {"fy",        HB_TAG('F','R','I',' ')},       /* Western Frisian */
@@ -334,17 +360,24 @@ static const LangTag ot_languages[] = {
   {"gd",        HB_TAG('G','A','E',' ')},       /* Scottish Gaelic */
   {"gez",       HB_TAG('G','E','Z',' ')},       /* Ge'ez */
   {"ggo",       HB_TAG('G','O','N',' ')},       /* Southern Gondi */
+  {"gih",       HB_TAG('G','I','H',' ')},       /* Githabul */
+  {"gil",       HB_TAG('G','I','L','0')},       /* Kiribati (Gilbertese) */
+  {"gkp",       HB_TAG('G','K','P',' ')},       /* Kpelle (Guinea) */
   {"gl",        HB_TAG('G','A','L',' ')},       /* Galician */
   {"gld",       HB_TAG('N','A','N',' ')},       /* Nanai */
+  {"gle",       HB_TAG('I','R','T',' ')},       /* Irish Traditional */
   {"glk",       HB_TAG('G','L','K',' ')},       /* Gilaki */
   {"gn",        HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
+  {"gnn",       HB_TAG('G','N','N',' ')},       /* Gumatj */
   {"gno",       HB_TAG('G','O','N',' ')},       /* Northern Gondi */
   {"gog",       HB_TAG('G','O','G',' ')},       /* Gogo */
   {"gon",       HB_TAG('G','O','N',' ')},       /* Gondi [macrolanguage] */
   {"grt",       HB_TAG('G','R','O',' ')},       /* Garo */
   {"gru",       HB_TAG('S','O','G',' ')},       /* Sodo Gurage */
+  {"gsw",       HB_TAG('A','L','S',' ')},       /* Alsatian */
   {"gu",        HB_TAG('G','U','J',' ')},       /* Gujarati */
   {"guc",       HB_TAG('G','U','C',' ')},       /* Wayuu */
+  {"guf",       HB_TAG('G','U','F',' ')},       /* Gupapuyngu */
   {"guk",       HB_TAG('G','M','Z',' ')},       /* Gumuz */
 /*{"guk",       HB_TAG('G','U','K',' ')},*/     /* Gumuz (in SIL fonts) */
   {"guz",       HB_TAG('G','U','Z',' ')},       /* Ekegusii/Gusii */
@@ -355,9 +388,9 @@ static const LangTag ot_languages[] = {
   {"hay",       HB_TAG('H','A','Y',' ')},       /* Haya */
   {"haz",       HB_TAG('H','A','Z',' ')},       /* Hazaragi */
   {"he",        HB_TAG('I','W','R',' ')},       /* Hebrew */
-  {"hz",        HB_TAG('H','E','R',' ')},       /* Herero */
   {"hi",        HB_TAG('H','I','N',' ')},       /* Hindi */
   {"hil",       HB_TAG('H','I','L',' ')},       /* Hiligaynon */
+  {"hmn",       HB_TAG('H','M','N',' ')},       /* Hmong */
   {"hnd",       HB_TAG('H','N','D',' ')},       /* [Southern] Hindko */
   {"hne",       HB_TAG('C','H','H',' ')},       /* Chattisgarhi */
   {"hno",       HB_TAG('H','N','D',' ')},       /* [Northern] Hindko */
@@ -371,11 +404,13 @@ static const LangTag ot_languages[] = {
   {"hy",        HB_TAG('H','Y','E',' ')},       /* Armenian */
   {"hz",        HB_TAG('H','E','R',' ')},       /* Herero */
   {"ia",        HB_TAG('I','N','A',' ')},       /* Interlingua (International Auxiliary Language Association) */
+  {"iba",       HB_TAG('I','B','A',' ')},       /* Iban */
   {"ibb",       HB_TAG('I','B','B',' ')},       /* Ibibio */
   {"id",        HB_TAG('I','N','D',' ')},       /* Indonesian */
   {"ie",        HB_TAG('I','L','E',' ')},       /* Interlingue/Occidental */
   {"ig",        HB_TAG('I','B','O',' ')},       /* Igbo */
   {"igb",       HB_TAG('E','B','I',' ')},       /* Ebira */
+  {"ii",        HB_TAG('Y','I','M',' ')},       /* Yi Modern */
   {"ijc",       HB_TAG('I','J','O',' ')},       /* Izon */
   {"ijo",       HB_TAG('I','J','O',' ')},       /* Ijo [family] */
   {"ik",        HB_TAG('I','P','K',' ')},       /* Inupiaq [macrolanguage] */
@@ -391,15 +426,20 @@ static const LangTag ot_languages[] = {
   {"jv",        HB_TAG('J','A','V',' ')},       /* Javanese */
   {"ka",        HB_TAG('K','A','T',' ')},       /* Georgian */
   {"kaa",       HB_TAG('K','R','K',' ')},       /* Karakalpak */
-  {"kab",       HB_TAG('K','A','B',' ')},       /* Kabyle */
+  {"kab",       HB_TAG('K','A','B','0')},       /* Kabyle */
   {"kam",       HB_TAG('K','M','B',' ')},       /* Kamba (Kenya) */
   {"kar",       HB_TAG('K','R','N',' ')},       /* Karen [family] */
+  {"kat",       HB_TAG('K','G','E',' ')},       /* Khutsuri Georgian */
   {"kbd",       HB_TAG('K','A','B',' ')},       /* Kabardian */
   {"kde",       HB_TAG('K','D','E',' ')},       /* Makonde */
   {"kdr",       HB_TAG('K','R','M',' ')},       /* Karaim */
   {"kdt",       HB_TAG('K','U','Y',' ')},       /* Kuy */
+  {"kea",       HB_TAG('K','E','A',' ')},       /* Kabuverdianu (Crioulo) */
+  {"kek",       HB_TAG('K','E','K',' ')},       /* Kekchi */
   {"kex",       HB_TAG('K','K','N',' ')},       /* Kokni */
+  {"kfa",       HB_TAG('K','O','D',' ')},       /* Kodagu */
   {"kfr",       HB_TAG('K','A','C',' ')},       /* Kachchi */
+  {"kfx",       HB_TAG('K','U','L',' ')},       /* Kulvi */
   {"kfy",       HB_TAG('K','M','N',' ')},       /* Kumaoni */
   {"kg",        HB_TAG('K','O','N',' ')},       /* Kongo [macrolanguage] */
   {"kha",       HB_TAG('K','S','I',' ')},       /* Khasi */
@@ -408,7 +448,9 @@ static const LangTag ot_languages[] = {
 /*{"kht",       HB_TAG('K','H','T',' ')},*/     /* Khamti (OpenType spec and SIL fonts) */
   {"khw",       HB_TAG('K','H','W',' ')},       /* Khowar */
   {"ki",        HB_TAG('K','I','K',' ')},       /* Gikuyu/Kikuyu */
+  {"kiu",       HB_TAG('K','I','U',' ')},       /* Kirmanjki */
   {"kj",        HB_TAG('K','U','A',' ')},       /* Kuanyama/Kwanyama */
+  {"kjd",       HB_TAG('K','J','D',' ')},       /* Southern Kiwai */
   {"kjh",       HB_TAG('K','H','A',' ')},       /* Khakass */
   {"kjp",       HB_TAG('K','J','P',' ')},       /* Pwo Eastern Karen */
   {"kk",        HB_TAG('K','A','Z',' ')},       /* Kazakh */
@@ -422,6 +464,8 @@ static const LangTag ot_languages[] = {
   {"ko",        HB_TAG('K','O','R',' ')},       /* Korean */
   {"koi",       HB_TAG('K','O','P',' ')},       /* Komi-Permyak */
   {"kok",       HB_TAG('K','O','K',' ')},       /* Konkani [macrolanguage] */
+  {"kon",       HB_TAG('K','O','N','0')},       /* Kongo */
+  {"kos",       HB_TAG('K','O','S',' ')},       /* Kosraean */
   {"kpe",       HB_TAG('K','P','L',' ')},       /* Kpelle [macrolanguage] */
   {"kpv",       HB_TAG('K','O','Z',' ')},       /* Komi-Zyrian */
   {"kpy",       HB_TAG('K','Y','K',' ')},       /* Koryak */
@@ -431,9 +475,11 @@ static const LangTag ot_languages[] = {
   {"krl",       HB_TAG('K','R','L',' ')},       /* Karelian */
   {"kru",       HB_TAG('K','U','U',' ')},       /* Kurukh */
   {"ks",        HB_TAG('K','S','H',' ')},       /* Kashmiri */
-  {"ksh",       HB_TAG('K','S','H',' ')},       /* Kölsch */
+  {"ksh",       HB_TAG('K','S','H','0')},       /* Ripuarian, Kölsch */
 /*{"ksw",       HB_TAG('K','R','N',' ')},*/     /* S'gaw Karen (Microsoft fonts?) */
   {"ksw",       HB_TAG('K','S','W',' ')},       /* S'gaw Karen (OpenType spec and SIL fonts) */
+  {"ktb",       HB_TAG('K','E','B',' ')},       /* Kebena */
+  {"ktu",       HB_TAG('K','O','N',' ')},       /* Kikongo */
   {"ku",        HB_TAG('K','U','R',' ')},       /* Kurdish [macrolanguage] */
   {"kum",       HB_TAG('K','U','M',' ')},       /* Kumyk */
   {"kv",        HB_TAG('K','O','M',' ')},       /* Komi [macrolanguage] */
@@ -461,6 +507,7 @@ static const LangTag ot_languages[] = {
   {"lmo",       HB_TAG('L','M','O',' ')},       /* Lombard */
   {"ln",        HB_TAG('L','I','N',' ')},       /* Lingala */
   {"lo",        HB_TAG('L','A','O',' ')},       /* Lao */
+  {"lom",       HB_TAG('L','O','M',' ')},       /* Loma */
   {"lrc",       HB_TAG('L','R','C',' ')},       /* Northern Luri */
   {"lt",        HB_TAG('L','T','H',' ')},       /* Lithuanian */
   {"lu",        HB_TAG('L','U','B',' ')},       /* Luba-Katanga */
@@ -475,6 +522,8 @@ static const LangTag ot_languages[] = {
   {"mag",       HB_TAG('M','A','G',' ')},       /* Magahi */
   {"mai",       HB_TAG('M','T','H',' ')},       /* Maithili */
   {"mak",       HB_TAG('M','K','R',' ')},       /* Makasar */
+  {"mal",       HB_TAG('M','A','L',' ')},       /* Malayalam */
+  {"mam",       HB_TAG('M','A','M',' ')},       /* Mam */
   {"man",       HB_TAG('M','N','K',' ')},       /* Manding/Mandingo [macrolanguage] */
   {"mdc",       HB_TAG('M','L','E',' ')},       /* Male (Papua New Guinea) */
   {"mdf",       HB_TAG('M','O','K',' ')},       /* Moksha */
@@ -517,6 +566,7 @@ static const LangTag ot_languages[] = {
   {"mww",       HB_TAG('M','W','W',' ')},       /* Hmong Daw */
   {"my",        HB_TAG('B','R','M',' ')},       /* Burmese */
   {"mym",       HB_TAG('M','E','N',' ')},       /* Me'en */
+  {"myn",       HB_TAG('M','Y','N',' ')},       /* Mayan */
   {"myq",       HB_TAG('M','N','K',' ')},       /* Forest Maninka (retired code) */
   {"myv",       HB_TAG('E','R','Z',' ')},       /* Erzya */
   {"mzn",       HB_TAG('M','Z','N',' ')},       /* Mazanderani */
@@ -534,6 +584,7 @@ static const LangTag ot_languages[] = {
   {"ng",        HB_TAG('N','D','G',' ')},       /* Ndonga */
   {"nga",       HB_TAG('N','G','A',' ')},       /* Ngabaka */
   {"ngl",       HB_TAG('L','M','W',' ')},       /* Lomwe */
+  {"ngo",       HB_TAG('S','X','T',' ')},       /* Sutu */
   {"niu",       HB_TAG('N','I','U',' ')},       /* Niuean */
   {"niv",       HB_TAG('G','I','L',' ')},       /* Gilyak */
   {"nl",        HB_TAG('N','L','D',' ')},       /* Dutch */
@@ -554,13 +605,15 @@ static const LangTag ot_languages[] = {
   {"oc",        HB_TAG('O','C','I',' ')},       /* Occitan (post 1500) */
   {"oj",        HB_TAG('O','J','B',' ')},       /* Ojibwa [macrolanguage] */
   {"ojs",       HB_TAG('O','C','R',' ')},       /* Oji-Cree */
+  {"okm",       HB_TAG('K','O','H',' ')},       /* Korean Old Hangul */
   {"om",        HB_TAG('O','R','O',' ')},       /* Oromo [macrolanguage] */
   {"or",        HB_TAG('O','R','I',' ')},       /* Oriya */
   {"os",        HB_TAG('O','S','S',' ')},       /* Ossetian */
   {"pa",        HB_TAG('P','A','N',' ')},       /* Panjabi */
   {"pag",       HB_TAG('P','A','G',' ')},       /* Pangasinan */
   {"pam",       HB_TAG('P','A','M',' ')},       /* Kapampangan/Pampanga */
-  {"pap",       HB_TAG('P','A','P',' ')},       /* Papiamento */
+  {"pap",       HB_TAG('P','A','P','0')},       /* Papiamento */
+  {"pau",       HB_TAG('P','A','U',' ')},       /* Palauan */
   {"pcc",       HB_TAG('P','C','C',' ')},       /* Bouyei */
   {"pcd",       HB_TAG('P','C','D',' ')},       /* Picard */
   {"pce",       HB_TAG('P','L','G',' ')},       /* [Ruching] Palaung */
@@ -574,24 +627,34 @@ static const LangTag ot_languages[] = {
   {"plp",       HB_TAG('P','A','P',' ')},       /* Palpa */
   {"pms",       HB_TAG('P','M','S',' ')},       /* Piemontese */
   {"pnb",       HB_TAG('P','N','B',' ')},       /* Western Panjabi */
+  {"poh",       HB_TAG('P','O','H',' ')},       /* Pocomchi */
+  {"pon",       HB_TAG('P','O','N',' ')},       /* Pohnpeian */
   {"prs",       HB_TAG('D','R','I',' ')},       /* Afghan Persian/Dari */
   {"ps",        HB_TAG('P','A','S',' ')},       /* Pashto/Pushto [macrolanguage] */
   {"pt",        HB_TAG('P','T','G',' ')},       /* Portuguese */
   {"pwo",       HB_TAG('P','W','O',' ')},       /* Pwo Western Karen */
   {"qu",        HB_TAG('Q','U','Z',' ')},       /* Quechua [macrolanguage] */
   {"quc",       HB_TAG('Q','U','C',' ')},       /* K'iche'/Quiché */
+  {"quh",       HB_TAG('Q','U','H',' ')},       /* Quechua (Bolivia) */
   {"quz",       HB_TAG('Q','U','Z',' ')},       /* Cusco Quechua */
+  {"qvi",       HB_TAG('Q','V','I',' ')},       /* Quechua (Ecuador) */
+  {"qwh",       HB_TAG('Q','W','H',' ')},       /* Quechua (Peru) */
   {"raj",       HB_TAG('R','A','J',' ')},       /* Rajasthani [macrolanguage] */
+  {"rar",       HB_TAG('R','A','R',' ')},       /* Rarotongan */
   {"rbb",       HB_TAG('P','L','G',' ')},       /* Rumai Palaung */
   {"rej",       HB_TAG('R','E','J',' ')},       /* Rejang */
   {"ria",       HB_TAG('R','I','A',' ')},       /* Riang (India) */
+  {"rif",       HB_TAG('R','I','F',' ')},       /* Tarifit */
   {"ril",       HB_TAG('R','I','A',' ')},       /* Riang (Myanmar) */
+  {"rit",       HB_TAG('R','I','T',' ')},       /* Ritarungo */
   {"rki",       HB_TAG('A','R','K',' ')},       /* Rakhine */
+  {"rkw",       HB_TAG('R','K','W',' ')},       /* Arakwal */
   {"rm",        HB_TAG('R','M','S',' ')},       /* Romansh */
   {"rmy",       HB_TAG('R','M','Y',' ')},       /* Vlax Romani */
   {"rn",        HB_TAG('R','U','N',' ')},       /* Rundi */
   {"ro",        HB_TAG('R','O','M',' ')},       /* Romanian */
   {"rom",       HB_TAG('R','O','Y',' ')},       /* Romany [macrolanguage] */
+  {"rtm",       HB_TAG('R','T','M',' ')},       /* Rotuman */
   {"ru",        HB_TAG('R','U','S',' ')},       /* Russian */
   {"rue",       HB_TAG('R','S','Y',' ')},       /* Rusyn */
   {"rup",       HB_TAG('R','U','P',' ')},       /* Aromanian/Arumanian/Macedo-Romanian */
@@ -599,10 +662,11 @@ static const LangTag ot_languages[] = {
   {"rwr",       HB_TAG('M','A','W',' ')},       /* Marwari (India) */
   {"sa",        HB_TAG('S','A','N',' ')},       /* Sanskrit */
   {"sah",       HB_TAG('Y','A','K',' ')},       /* Yakut */
+  {"sam",       HB_TAG('P','A','A',' ')},       /* Palestinian Aramaic */
   {"sas",       HB_TAG('S','A','S',' ')},       /* Sasak */
   {"sat",       HB_TAG('S','A','T',' ')},       /* Santali */
-  {"sck",       HB_TAG('S','A','D',' ')},       /* Sadri */
   {"sc",        HB_TAG('S','R','D',' ')},       /* Sardinian [macrolanguage] */
+  {"sck",       HB_TAG('S','A','D',' ')},       /* Sadri */
   {"scn",       HB_TAG('S','C','N',' ')},       /* Sicilian */
   {"sco",       HB_TAG('S','C','O',' ')},       /* Scots */
   {"scs",       HB_TAG('S','L','A',' ')},       /* [North] Slavey */
@@ -615,6 +679,7 @@ static const LangTag ot_languages[] = {
   {"sgs",       HB_TAG('S','G','S',' ')},       /* Samogitian */
   {"sgw",       HB_TAG('C','H','G',' ')},       /* Sebat Bet Gurage */
 /*{"sgw",       HB_TAG('S','G','W',' ')},*/     /* Sebat Bet Gurage (in SIL fonts) */
+  {"shi",       HB_TAG('S','H','I',' ')},       /* Tachelhit */
   {"shn",       HB_TAG('S','H','N',' ')},       /* Shan */
   {"si",        HB_TAG('S','N','H',' ')},       /* Sinhala */
   {"sid",       HB_TAG('S','I','D',' ')},       /* Sidamo */
@@ -627,7 +692,7 @@ static const LangTag ot_languages[] = {
   {"smj",       HB_TAG('L','S','M',' ')},       /* Lule Sami */
   {"smn",       HB_TAG('I','S','M',' ')},       /* Inari Sami */
   {"sms",       HB_TAG('S','K','S',' ')},       /* Skolt Sami */
-  {"sn",        HB_TAG('S','N','A',' ')},       /* Shona */
+  {"sn",        HB_TAG('S','N','A','0')},       /* Shona */
   {"snk",       HB_TAG('S','N','K',' ')},       /* Soninke */
   {"so",        HB_TAG('S','M','L',' ')},       /* Somali */
   {"sop",       HB_TAG('S','O','P',' ')},       /* Songe */
@@ -665,20 +730,24 @@ static const LangTag ot_languages[] = {
   {"tiv",       HB_TAG('T','I','V',' ')},       /* Tiv */
   {"tk",        HB_TAG('T','K','M',' ')},       /* Turkmen */
   {"tl",        HB_TAG('T','G','L',' ')},       /* Tagalog */
-  {"tmh",       HB_TAG('t','m','h',' ')},       /* Tamashek [macrolanguage] */
+  {"tmh",       HB_TAG('T','M','H',' ')},       /* Tamashek */
   {"tn",        HB_TAG('T','N','A',' ')},       /* Tswana */
   {"to",        HB_TAG('T','G','N',' ')},       /* Tonga (Tonga Islands) */
+  {"tod",       HB_TAG('T','O','D','0')},       /* Toma */
+  {"toi",       HB_TAG('T','N','G',' ')},       /* Tonga */
   {"tpi",       HB_TAG('T','P','I',' ')},       /* Tok Pisin */
   {"tr",        HB_TAG('T','R','K',' ')},       /* Turkish */
   {"tru",       HB_TAG('T','U','A',' ')},       /* Turoyo Aramaic */
   {"ts",        HB_TAG('T','S','G',' ')},       /* Tsonga */
   {"tt",        HB_TAG('T','A','T',' ')},       /* Tatar */
   {"tum",       HB_TAG('T','U','M',' ')},       /* Tumbuka */
+  {"tvl",       HB_TAG('T','V','L',' ')},       /* Tuvalu */
   {"tw",        HB_TAG('T','W','I',' ')},       /* Twi */
   {"ty",        HB_TAG('T','H','T',' ')},       /* Tahitian */
   {"tyv",       HB_TAG('T','U','V',' ')},       /* Tuvin */
   {"tyz",       HB_TAG('T','Y','Z',' ')},       /* Tày */
   {"tzm",       HB_TAG('T','Z','M',' ')},       /* Central Atlas Tamazight */
+  {"tzo",       HB_TAG('T','Z','O',' ')},       /* Tzotzil */
   {"udm",       HB_TAG('U','D','M',' ')},       /* Udmurt */
   {"ug",        HB_TAG('U','Y','G',' ')},       /* Uighur */
   {"uk",        HB_TAG('U','K','R',' ')},       /* Ukrainian */
@@ -690,8 +759,8 @@ static const LangTag ot_languages[] = {
   {"uzs",       HB_TAG('U','Z','B',' ')},       /* Southern Uzbek */
   {"ve",        HB_TAG('V','E','N',' ')},       /* Venda */
   {"vec",       HB_TAG('V','E','C',' ')},       /* Venetian */
-  {"vls",       HB_TAG('F','L','E',' ')},       /* Vlaams */
   {"vi",        HB_TAG('V','I','T',' ')},       /* Vietnamese */
+  {"vls",       HB_TAG('F','L','E',' ')},       /* Vlaams */
   {"vmw",       HB_TAG('M','A','K',' ')},       /* Makhuwa */
   {"vo",        HB_TAG('V','O','L',' ')},       /* Volapük */
   {"vro",       HB_TAG('V','R','O',' ')},       /* Võro */
@@ -700,72 +769,60 @@ static const LangTag ot_languages[] = {
   {"wbm",       HB_TAG('W','A',' ',' ')},       /* Wa */
   {"wbr",       HB_TAG('W','A','G',' ')},       /* Wagdi */
   {"wle",       HB_TAG('S','I','G',' ')},       /* Wolane */
+  {"wo",        HB_TAG('W','L','F',' ')},       /* Wolof */
   {"wry",       HB_TAG('M','A','W',' ')},       /* Merwari */
   {"wtm",       HB_TAG('W','T','M',' ')},       /* Mewati */
-  {"wo",        HB_TAG('W','L','F',' ')},       /* Wolof */
   {"xal",       HB_TAG('K','L','M',' ')},       /* Kalmyk */
+  {"xan",       HB_TAG('S','E','K',' ')},       /* Sekota */
   {"xh",        HB_TAG('X','H','S',' ')},       /* Xhosa */
+  {"xjb",       HB_TAG('X','J','B',' ')},       /* Minjangbal */
   {"xog",       HB_TAG('X','O','G',' ')},       /* Soga */
   {"xom",       HB_TAG('K','M','O',' ')},       /* Komo (Sudan) */
+  {"xpe",       HB_TAG('X','P','E',' ')},       /* Kpelle (Liberia) */
   {"xsl",       HB_TAG('S','S','L',' ')},       /* South Slavey */
   {"xst",       HB_TAG('S','I','G',' ')},       /* Silt'e (retired code) */
   {"xwo",       HB_TAG('T','O','D',' ')},       /* Written Oirat (Todo) */
   {"yao",       HB_TAG('Y','A','O',' ')},       /* Yao */
+  {"yap",       HB_TAG('Y','A','P',' ')},       /* Yapese */
   {"yi",        HB_TAG('J','I','I',' ')},       /* Yiddish [macrolanguage] */
   {"yo",        HB_TAG('Y','B','A',' ')},       /* Yoruba */
   {"yso",       HB_TAG('N','I','S',' ')},       /* Nisi (China) */
   {"za",        HB_TAG('Z','H','A',' ')},       /* Chuang/Zhuang [macrolanguage] */
   {"zea",       HB_TAG('Z','E','A',' ')},       /* Zeeuws */
+  {"zgh",       HB_TAG('Z','G','H',' ')},       /* Standard Morrocan Tamazigh */
   {"zne",       HB_TAG('Z','N','D',' ')},       /* Zande */
   {"zu",        HB_TAG('Z','U','L',' ')},       /* Zulu */
-  {"zum",       HB_TAG('L','R','C',' ')}        /* Kumzari */
+  {"zum",       HB_TAG('L','R','C',' ')},       /* Kumzari */
+  {"zza",       HB_TAG('Z','Z','A',' ')},       /* Zazaki */
 
   /* The corresponding languages IDs for the following IDs are unclear,
    * overlap, or are architecturally weird. Needs more research. */
 
-/*{"ahg/awn/xan?",      HB_TAG('A','G','W',' ')},*/     /* Agaw */
-/*{"gsw?/gsw-FR?",      HB_TAG('A','L','S',' ')},*/     /* Alsatian */
+/*{"chp",       HB_TAG('S','A','Y',' ')},*/     /* Sayisi */
+/*{"cwd",       HB_TAG('T','C','R',' ')},*/     /* TH-Cree */
+/*{"emk",       HB_TAG('E','M','K',' ')},*/     /* Eastern Maninkakan */
 /*{"krc",       HB_TAG('B','A','L',' ')},*/     /* Balkar */
 /*{"??",        HB_TAG('B','C','R',' ')},*/     /* Bible Cree */
 /*{"zh?",       HB_TAG('C','H','N',' ')},*/     /* Chinese (seen in Microsoft fonts) */
-/*{"acf/gcf?",  HB_TAG('F','A','N',' ')},*/     /* French Antillean */
-/*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/     /* Forest Nenets */
-/*{"fuf?",      HB_TAG('F','T','A',' ')},*/     /* Futa */
 /*{"ar-Syrc?",  HB_TAG('G','A','R',' ')},*/     /* Garshuni */
-/*{"cfm/rnl?",  HB_TAG('H','A','L',' ')},*/     /* Halam */
-/*{"ga-Latg?/Latg?",    HB_TAG('I','R','T',' ')},*/     /* Irish Traditional */
+/*{"hy?",       HB_TAG('H','Y','E','0')},*/     /* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
+/*{"ga-Latg?/"  HB_TAG('I','R','T',' ')},*/     /* Irish Traditional */
 /*{"krc",       HB_TAG('K','A','R',' ')},*/     /* Karachay */
-/*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/     /* Kebena */
-/*{"Geok",      HB_TAG('K','G','E',' ')},*/     /* Khutsuri Georgian */
+/*{"ka-Geok?",  HB_TAG('K','G','E',' ')},*/     /* Khutsuri Georgian */
 /*{"kca",       HB_TAG('K','H','K',' ')},*/     /* Khanty-Kazim */
 /*{"kca",       HB_TAG('K','H','S',' ')},*/     /* Khanty-Shurishkar */
 /*{"kca",       HB_TAG('K','H','V',' ')},*/     /* Khanty-Vakhi */
-/*{"guz?/kqs?/kss?",    HB_TAG('K','I','S',' ')},*/     /* Kisii */
-/*{"kfa/kfi?/kpb?/xua?/xuj?",   HB_TAG('K','O','D',' ')},*/     /* Kodagu */
-/*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/     /* Korean Old Hangul */
-/*{"kon?/ktu?/...",     HB_TAG('K','O','N',' ')},*/     /* Kikongo */
-/*{"kfx?",      HB_TAG('K','U','L',' ')},*/     /* Kulvi */
-/*{"??",        HB_TAG('L','A','H',' ')},*/     /* Lahuli */
-/*{"??",        HB_TAG('L','C','R',' ')},*/     /* L-Cree */
+/*{"kqs, kss",  HB_TAG('K','I','S',' ')},*/     /* Kisii */
+/*{"lua",       HB_TAG('L','U','A',' ')},*/     /* Luba-Lulua */
+/*{"mlq",       HB_TAG('M','L','N',' ')},*/     /* Malinke */
+/*{"nso",       HB_TAG('N','S','O',' ')},*/     /* Sotho, Northern */
 /*{"??",        HB_TAG('M','A','L',' ')},*/     /* Malayalam Traditional */
-/*{"mnk?/mlq?/...",     HB_TAG('M','L','N',' ')},*/     /* Malinke */
-/*{"??",        HB_TAG('N','C','R',' ')},*/     /* N-Cree */
-/*{"??",        HB_TAG('N','H','C',' ')},*/     /* Norway House Cree */
-/*{"jpa?/sam?", HB_TAG('P','A','A',' ')},*/     /* Palestinian Aramaic */
-/*{"polyton",   HB_TAG('P','G','R',' ')},*/     /* Polytonic Greek */
-/*{"??",        HB_TAG('Q','I','N',' ')},*/     /* Asho Chin */
-/*{"??",        HB_TAG('R','C','R',' ')},*/     /* R-Cree */
-/*{"chp?",      HB_TAG('S','A','Y',' ')},*/     /* Sayisi */
-/*{"xan?",      HB_TAG('S','E','K',' ')},*/     /* Sekota */
-/*{"ngo?",      HB_TAG('S','X','T',' ')},*/     /* Sutu */
-/*{"??",        HB_TAG('T','C','R',' ')},*/     /* TH-Cree */
-/*{"tnz?/tog?/toi?",    HB_TAG('T','N','G',' ')},*/     /* Tonga */
-/*{"enh?/yrk?", HB_TAG('T','N','E',' ')},*/     /* Tundra Nenets */
-/*{"??",        HB_TAG('W','C','R',' ')},*/     /* West-Cree */
-/*{"cre?",      HB_TAG('Y','C','R',' ')},*/     /* Y-Cree */
+/*{"csw",       HB_TAG('N','C','R',' ')},*/     /* N-Cree */
+/*{"csw",       HB_TAG('N','H','C',' ')},*/     /* Norway House Cree */
+/*{"el-polyton",        HB_TAG('P','G','R',' ')},*/     /* Polytonic Greek */
+/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh",      HB_TAG('Q','I','N',' ')},*/     /* Chin */
 /*{"??",        HB_TAG('Y','I','C',' ')},*/     /* Yi Classic */
-/*{"ii?/Yiii?", HB_TAG('Y','I','M',' ')},*/     /* Yi Modern */
-/*{"??",        HB_TAG('Z','H','P',' ')},*/     /* Chinese Phonetic */
+/*{"zh-Latn-pinyin",    HB_TAG('Z','H','P',' ')},*/     /* Chinese Phonetic */
 };
 
 typedef struct {
@@ -928,4 +985,27 @@ hb_ot_tag_to_language (hb_tag_t tag)
   }
 }
 
+#ifdef MAIN
+static inline void
+test_langs_sorted (void)
+{
+  for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
+  {
+    int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language);
+    if (c >= 0)
+    {
+      fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
+               i, ot_languages[i-1].language, c, ot_languages[i].language);
+      abort();
+    }
+  }
+}
 
+int
+main (void)
+{
+  test_langs_sorted ();
+  return 0;
+}
+
+#endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
index f0279530b8e..10cf3972df6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
@@ -39,18 +39,18 @@ HB_BEGIN_DECLS
 #define HB_OT_TAG_DEFAULT_SCRIPT        HB_TAG ('D', 'F', 'L', 'T')
 #define HB_OT_TAG_DEFAULT_LANGUAGE      HB_TAG ('d', 'f', 'l', 't')
 
-void
+HB_EXTERN void
 hb_ot_tags_from_script (hb_script_t  script,
                         hb_tag_t    *script_tag_1,
                         hb_tag_t    *script_tag_2);
 
-hb_script_t
+HB_EXTERN hb_script_t
 hb_ot_tag_to_script (hb_tag_t tag);
 
-hb_tag_t
+HB_EXTERN hb_tag_t
 hb_ot_tag_from_language (hb_language_t language);
 
-hb_language_t
+HB_EXTERN hb_language_t
 hb_ot_tag_to_language (hb_tag_t tag);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
index 4d10d51ccf4..1f270ee698c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
@@ -83,7 +83,7 @@ extern "C" void  hb_free_impl(void *ptr);
 #define unlikely(expr) (expr)
 #endif
 
-#ifndef __GNUC__
+#if !defined(__GNUC__) && !defined(__clang__)
 #undef __attribute__
 #define __attribute__(x)
 #endif
@@ -119,6 +119,36 @@ extern "C" void  hb_free_impl(void *ptr);
 #define HB_FUNC __func__
 #endif
 
+/*
+ * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+ * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
+ * cases that fall through without a break or return statement. HB_FALLTHROUGH
+ * is only needed on cases that have code:
+ *
+ * switch (foo) {
+ *   case 1: // These cases have no code. No fallthrough annotations are needed.
+ *   case 2:
+ *   case 3:
+ *     foo = 4; // This case has code, so a fallthrough annotation is needed:
+ *     HB_FALLTHROUGH;
+ *   default:
+ *     return foo;
+ * }
+ */
+#if defined(__clang__) && __cplusplus >= 201103L
+   /* clang's fallthrough annotations are only available starting in C++11. */
+#  define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif defined(_MSC_VER)
+   /*
+    * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
+    * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
+    */
+#  include 
+#  define HB_FALLTHROUGH __fallthrough
+#else
+#  define HB_FALLTHROUGH /* FALLTHROUGH */
+#endif
+
 #if defined(_WIN32) || defined(__CYGWIN__)
    /* We need Windows Vista for both Uniscribe backend and for
     * MemoryBarrier.  We don't support compiling on Windows XP,
@@ -139,6 +169,7 @@ extern "C" void  hb_free_impl(void *ptr);
 #  if defined(_WIN32_WCE)
      /* Some things not defined on Windows CE. */
 #    define strdup _strdup
+#    define vsnprintf _vsnprintf
 #    define getenv(Name) NULL
 #    if _WIN32_WCE < 0x800
 #      define setlocale(Category, Locale) "C"
@@ -149,6 +180,9 @@ static int errno = 0; /* Use something better? */
 #  endif
 #  if defined(_MSC_VER) && _MSC_VER < 1900
 #    define snprintf _snprintf
+#  elif defined(_MSC_VER) && _MSC_VER >= 1900
+#    /* Covers VC++ Error for strdup being a deprecated POSIX name and to instead use _strdup instead */
+#    define strdup _strdup
 #  endif
 #endif
 
@@ -210,9 +244,9 @@ static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
 #define _ASSERT_STATIC0(_line, _cond)   _ASSERT_STATIC1 (_line, (_cond))
 #define ASSERT_STATIC(_cond)            _ASSERT_STATIC0 (__LINE__, (_cond))
 
-/* Note: C++ allows sizeof() of variable-lengh arrays.  So, if _cond is not
- * constant, it still compiles (ouch!), but at least we'll get a -Wvla warning. */
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * sizeof (char[(_cond) ? 1 : -1]))
+template  class hb_assert_constant_t {};
+
+#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
 
 #define _PASTE1(a,b) a##b
 #define PASTE(a,b) _PASTE1(a,b)
@@ -578,6 +612,15 @@ static inline unsigned char TOLOWER (unsigned char c)
 /* Debug */
 
 
+/* HB_NDEBUG disables some sanity checks that are very safe to disable and
+ * should be disabled in production systems.  If NDEBUG is defined, enable
+ * HB_NDEBUG; but if it's desirable that normal assert()s (which are very
+ * light-weight) to be enabled, then HB_DEBUG can be defined to disable
+ * the costlier checks. */
+#ifdef NDEBUG
+#define HB_NDEBUG
+#endif
+
 #ifndef HB_DEBUG
 #define HB_DEBUG 0
 #endif
@@ -861,6 +904,29 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
 }
 
 
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another...  So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+        extern "C++" { \
+          static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+          static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+          static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+          static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
+          static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+          static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+          static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+        }
+
+
 /* Useful for set-operations on small enums.
  * For example, for testing "x ∈ {x1, x2, x3}" use:
  * (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
@@ -949,5 +1015,7 @@ hb_options (void)
   return _hb_options.opts;
 }
 
+/* Size signifying variable-sized array */
+#define VAR 1
 
 #endif /* HB_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
index 806479fbefc..f7a544f0b50 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
@@ -44,109 +44,109 @@ HB_BEGIN_DECLS
 typedef struct hb_set_t hb_set_t;
 
 
-hb_set_t *
+HB_EXTERN hb_set_t *
 hb_set_create (void);
 
-hb_set_t *
+HB_EXTERN hb_set_t *
 hb_set_get_empty (void);
 
-hb_set_t *
+HB_EXTERN hb_set_t *
 hb_set_reference (hb_set_t *set);
 
-void
+HB_EXTERN void
 hb_set_destroy (hb_set_t *set);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_set_user_data (hb_set_t           *set,
                       hb_user_data_key_t *key,
                       void *              data,
                       hb_destroy_func_t   destroy,
                       hb_bool_t           replace);
 
-void *
+HB_EXTERN void *
 hb_set_get_user_data (hb_set_t           *set,
                       hb_user_data_key_t *key);
 
 
 /* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_allocation_successful (const hb_set_t *set);
 
-void
+HB_EXTERN void
 hb_set_clear (hb_set_t *set);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_is_empty (const hb_set_t *set);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_has (const hb_set_t *set,
             hb_codepoint_t  codepoint);
 
 /* Right now limited to 16-bit integers.  Eventually will do full codepoint range, sans -1
  * which we will use as a sentinel. */
-void
+HB_EXTERN void
 hb_set_add (hb_set_t       *set,
             hb_codepoint_t  codepoint);
 
-void
+HB_EXTERN void
 hb_set_add_range (hb_set_t       *set,
                   hb_codepoint_t  first,
                   hb_codepoint_t  last);
 
-void
+HB_EXTERN void
 hb_set_del (hb_set_t       *set,
             hb_codepoint_t  codepoint);
 
-void
+HB_EXTERN void
 hb_set_del_range (hb_set_t       *set,
                   hb_codepoint_t  first,
                   hb_codepoint_t  last);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_is_equal (const hb_set_t *set,
                  const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_set (hb_set_t       *set,
             const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_union (hb_set_t       *set,
               const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_intersect (hb_set_t       *set,
                   const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_subtract (hb_set_t       *set,
                  const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_symmetric_difference (hb_set_t       *set,
                              const hb_set_t *other);
 
-void
+HB_EXTERN void
 hb_set_invert (hb_set_t *set);
 
-unsigned int
+HB_EXTERN unsigned int
 hb_set_get_population (const hb_set_t *set);
 
 /* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
 hb_set_get_min (const hb_set_t *set);
 
 /* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
 hb_set_get_max (const hb_set_t *set);
 
 /* Pass -1 in to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_next (const hb_set_t *set,
              hb_codepoint_t *codepoint);
 
 /* Pass -1 for first and last to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_set_next_range (const hb_set_t *set,
                    hb_codepoint_t *first,
                    hb_codepoint_t *last);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
index 33f8ce6f8cc..a86d468181e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
@@ -38,49 +38,49 @@ HB_BEGIN_DECLS
 
 typedef struct hb_shape_plan_t hb_shape_plan_t;
 
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
 hb_shape_plan_create (hb_face_t                     *face,
                       const hb_segment_properties_t *props,
                       const hb_feature_t            *user_features,
                       unsigned int                   num_user_features,
                       const char * const            *shaper_list);
 
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
 hb_shape_plan_create_cached (hb_face_t                     *face,
                              const hb_segment_properties_t *props,
                              const hb_feature_t            *user_features,
                              unsigned int                   num_user_features,
                              const char * const            *shaper_list);
 
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
 hb_shape_plan_get_empty (void);
 
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
 hb_shape_plan_reference (hb_shape_plan_t *shape_plan);
 
-void
+HB_EXTERN void
 hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_shape_plan_set_user_data (hb_shape_plan_t    *shape_plan,
                              hb_user_data_key_t *key,
                              void *              data,
                              hb_destroy_func_t   destroy,
                              hb_bool_t           replace);
 
-void *
+HB_EXTERN void *
 hb_shape_plan_get_user_data (hb_shape_plan_t    *shape_plan,
                              hb_user_data_key_t *key);
 
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
                        hb_font_t          *font,
                        hb_buffer_t        *buffer,
                        const hb_feature_t *features,
                        unsigned int        num_features);
 
-const char *
+HB_EXTERN const char *
 hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
index 2113f90fcb3..2fbaf405a56 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
@@ -210,13 +210,15 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
 /**
  * hb_feature_from_string:
  * @str: (array length=len) (element-type uint8_t): a string to parse
- * @len: length of @str, or -1 if string is nul-terminated
+ * @len: length of @str, or -1 if string is %NULL terminated
  * @feature: (out): the #hb_feature_t to initialize with the parsed values
  *
- * Parses a string into a #hb_feature_t. If @len is -1 then @str is
- * %NULL-terminated.
+ * Parses a string into a #hb_feature_t.
  *
- * Return value: %TRUE if @str is successfully parsed, %FALSE otherwise
+ * TODO: document the syntax here.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise.
  *
  * Since: 0.9.5
  **/
@@ -392,8 +394,6 @@ hb_shape_full (hb_font_t          *font,
  * positioned glyphs. If @features is not %NULL, it will be used to control the
  * features applied during shaping.
  *
- * Return value: %FALSE if all shapers failed, %TRUE otherwise
- *
  * Since: 0.9.2
  **/
 void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
index 1059d2bae2c..460f770df15 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
@@ -47,29 +47,29 @@ typedef struct hb_feature_t {
   unsigned int  end;
 } hb_feature_t;
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_feature_from_string (const char *str, int len,
                         hb_feature_t *feature);
 
-void
+HB_EXTERN void
 hb_feature_to_string (hb_feature_t *feature,
                       char *buf, unsigned int size);
 
 
-void
+HB_EXTERN void
 hb_shape (hb_font_t           *font,
           hb_buffer_t         *buffer,
           const hb_feature_t  *features,
           unsigned int         num_features);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_shape_full (hb_font_t          *font,
                hb_buffer_t        *buffer,
                const hb_feature_t *features,
                unsigned int        num_features,
                const char * const *shaper_list);
 
-const char **
+HB_EXTERN const char **
 hb_shape_list_shapers (void);
 
 
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
index 6c537d49215..b0835d31ab1 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
@@ -46,6 +46,9 @@ HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
 #ifdef HAVE_UNISCRIBE
 HB_SHAPER_IMPLEMENT (uniscribe)
 #endif
+#ifdef HAVE_DIRECTWRITE
+HB_SHAPER_IMPLEMENT (directwrite)
+#endif
 #ifdef HAVE_CORETEXT
 HB_SHAPER_IMPLEMENT (coretext)
 #endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
index 87cf18d3513..5da04edbf54 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
@@ -154,6 +154,12 @@ static const hb_script_t ucdn_script_translate[] =
     HB_SCRIPT_MULTANI,
     HB_SCRIPT_OLD_HUNGARIAN,
     HB_SCRIPT_SIGNWRITING,
+    HB_SCRIPT_ADLAM,
+    HB_SCRIPT_BHAIKSUKI,
+    HB_SCRIPT_MARCHEN,
+    HB_SCRIPT_NEWA,
+    HB_SCRIPT_OSAGE,
+    HB_SCRIPT_TANGUT,
 };
 
 static hb_unicode_combining_class_t
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
index d1a4195734a..f4e9be17c05 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
@@ -16,6 +16,7 @@
 
 #include 
 #include 
+#include 
 #include "ucdn.h"
 
 typedef struct {
@@ -24,14 +25,19 @@ typedef struct {
     unsigned char bidi_class;
     unsigned char mirrored;
     unsigned char east_asian_width;
-    unsigned char normalization_check;
     unsigned char script;
+    unsigned char linebreak_class;
 } UCDRecord;
 
 typedef struct {
     unsigned short from, to;
 } MirrorPair;
 
+typedef struct {
+  unsigned short from, to;
+  unsigned char type;
+} BracketPair;
+
 typedef struct {
     unsigned int start;
     short count, index;
@@ -108,6 +114,24 @@ static int compare_mp(const void *a, const void *b)
     return mpa->from - mpb->from;
 }
 
+static int compare_bp(const void *a, const void *b)
+{
+    BracketPair *bpa = (BracketPair *)a;
+    BracketPair *bpb = (BracketPair *)b;
+    return bpa->from - bpb->from;
+}
+
+static BracketPair *search_bp(uint32_t code)
+{
+    BracketPair bp = {0,0,2};
+    BracketPair *res;
+
+    bp.from = code;
+    res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair),
+            compare_bp);
+    return res;
+}
+
 static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
 {
     int si = code - SBASE;
@@ -199,6 +223,42 @@ int ucdn_get_script(uint32_t code)
     return get_ucd_record(code)->script;
 }
 
+int ucdn_get_linebreak_class(uint32_t code)
+{
+    return get_ucd_record(code)->linebreak_class;
+}
+
+int ucdn_get_resolved_linebreak_class(uint32_t code)
+{
+    const UCDRecord *record = get_ucd_record(code);
+
+    switch (record->linebreak_class)
+    {
+    case UCDN_LINEBREAK_CLASS_AI:
+    case UCDN_LINEBREAK_CLASS_SG:
+    case UCDN_LINEBREAK_CLASS_XX:
+        return UCDN_LINEBREAK_CLASS_AL;
+
+    case UCDN_LINEBREAK_CLASS_SA:
+        if (record->category == UCDN_GENERAL_CATEGORY_MC ||
+                record->category == UCDN_GENERAL_CATEGORY_MN)
+            return UCDN_LINEBREAK_CLASS_CM;
+        return UCDN_LINEBREAK_CLASS_AL;
+
+    case UCDN_LINEBREAK_CLASS_CJ:
+        return UCDN_LINEBREAK_CLASS_NS;
+
+    case UCDN_LINEBREAK_CLASS_CB:
+        return UCDN_LINEBREAK_CLASS_B2;
+
+    case UCDN_LINEBREAK_CLASS_NL:
+        return UCDN_LINEBREAK_CLASS_BK;
+
+    default:
+        return record->linebreak_class;
+    }
+}
+
 uint32_t ucdn_mirror(uint32_t code)
 {
     MirrorPair mp = {0};
@@ -217,6 +277,24 @@ uint32_t ucdn_mirror(uint32_t code)
         return res->to;
 }
 
+uint32_t ucdn_paired_bracket(uint32_t code)
+{
+    BracketPair *res = search_bp(code);
+    if (res == NULL)
+        return code;
+    else
+        return res->to;
+}
+
+int ucdn_paired_bracket_type(uint32_t code)
+{
+    BracketPair *res = search_bp(code);
+    if (res == NULL)
+        return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE;
+    else
+        return res->type;
+}
+
 int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b)
 {
     const unsigned short *rec;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
index 8354ae53334..f694dc5a897 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
@@ -17,6 +17,8 @@
 #ifndef UCDN_H
 #define UCDN_H
 
+
+
 #if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
 # define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
 # define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
@@ -58,6 +60,7 @@ typedef unsigned __int64 uint64_t;
 
 #endif
 
+
 #define UCDN_EAST_ASIAN_F 0
 #define UCDN_EAST_ASIAN_H 1
 #define UCDN_EAST_ASIAN_W 2
@@ -197,6 +200,53 @@ typedef unsigned __int64 uint64_t;
 #define UCDN_SCRIPT_MULTANI 129
 #define UCDN_SCRIPT_OLD_HUNGARIAN 130
 #define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
+
+#define UCDN_LINEBREAK_CLASS_OP 0
+#define UCDN_LINEBREAK_CLASS_CL 1
+#define UCDN_LINEBREAK_CLASS_CP 2
+#define UCDN_LINEBREAK_CLASS_QU 3
+#define UCDN_LINEBREAK_CLASS_GL 4
+#define UCDN_LINEBREAK_CLASS_NS 5
+#define UCDN_LINEBREAK_CLASS_EX 6
+#define UCDN_LINEBREAK_CLASS_SY 7
+#define UCDN_LINEBREAK_CLASS_IS 8
+#define UCDN_LINEBREAK_CLASS_PR 9
+#define UCDN_LINEBREAK_CLASS_PO 10
+#define UCDN_LINEBREAK_CLASS_NU 11
+#define UCDN_LINEBREAK_CLASS_AL 12
+#define UCDN_LINEBREAK_CLASS_HL 13
+#define UCDN_LINEBREAK_CLASS_ID 14
+#define UCDN_LINEBREAK_CLASS_IN 15
+#define UCDN_LINEBREAK_CLASS_HY 16
+#define UCDN_LINEBREAK_CLASS_BA 17
+#define UCDN_LINEBREAK_CLASS_BB 18
+#define UCDN_LINEBREAK_CLASS_B2 19
+#define UCDN_LINEBREAK_CLASS_ZW 20
+#define UCDN_LINEBREAK_CLASS_CM 21
+#define UCDN_LINEBREAK_CLASS_WJ 22
+#define UCDN_LINEBREAK_CLASS_H2 23
+#define UCDN_LINEBREAK_CLASS_H3 24
+#define UCDN_LINEBREAK_CLASS_JL 25
+#define UCDN_LINEBREAK_CLASS_JV 26
+#define UCDN_LINEBREAK_CLASS_JT 27
+#define UCDN_LINEBREAK_CLASS_RI 28
+#define UCDN_LINEBREAK_CLASS_AI 29
+#define UCDN_LINEBREAK_CLASS_BK 30
+#define UCDN_LINEBREAK_CLASS_CB 31
+#define UCDN_LINEBREAK_CLASS_CJ 32
+#define UCDN_LINEBREAK_CLASS_CR 33
+#define UCDN_LINEBREAK_CLASS_LF 34
+#define UCDN_LINEBREAK_CLASS_NL 35
+#define UCDN_LINEBREAK_CLASS_SA 36
+#define UCDN_LINEBREAK_CLASS_SG 37
+#define UCDN_LINEBREAK_CLASS_SP 38
+#define UCDN_LINEBREAK_CLASS_XX 39
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
@@ -253,6 +303,10 @@ typedef unsigned __int64 uint64_t;
 #define UCDN_BIDI_CLASS_FSI 21
 #define UCDN_BIDI_CLASS_PDI 22
 
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2
+
 /**
  * Return version of the Unicode database.
  *
@@ -301,6 +355,27 @@ int ucdn_get_bidi_class(uint32_t code);
  */
 int ucdn_get_script(uint32_t code);
 
+/**
+ * Get unresolved linebreak class of a codepoint. This does not take
+ * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class()
+ * for resolved linebreak classes.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_linebreak_class(uint32_t code);
+
+/**
+ * Get resolved linebreak class of a codepoint. This resolves characters
+ * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14.
+ * In addition the CB class is resolved as the equivalent B2 class and
+ * the NL class is resolved as the equivalent BK class.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_resolved_linebreak_class(uint32_t code);
+
 /**
  * Check if codepoint can be mirrored.
  *
@@ -318,6 +393,25 @@ int ucdn_get_mirrored(uint32_t code);
  */
 uint32_t ucdn_mirror(uint32_t code);
 
+/**
+ * Get paired bracket for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return paired bracket codepoint or the original codepoint if no
+ * paired bracket character exists
+ */
+uint32_t ucdn_paired_bracket(uint32_t code);
+
+/**
+ * Get paired bracket type for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined
+ * in UAX#9.
+ *
+ */
+int ucdn_paired_bracket_type(uint32_t code);
+
 /**
  * Pairwise canonical decomposition of a codepoint. This includes
  * Hangul Jamo decomposition (see chapter 3.12 of the Unicode core
@@ -359,6 +453,8 @@ int ucdn_compat_decompose(uint32_t code, uint32_t *decomposed);
  */
 int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b);
 
-HB_END_HEADER
+#ifdef __cplusplus
+}
+#endif
 
 #endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
index 18c184a2220..034511b8b12 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
@@ -1,821 +1,999 @@
 /* this file was generated by makeunicodedata.py 3.2 */
 
-#define UNIDATA_VERSION "8.0.0"
+#define UNIDATA_VERSION "9.0.0"
 /* a list of unique database records */
 static const UCDRecord ucd_records[] = {
-    {2, 0, 18, 0, 5, 0, 102},
-    {0, 0, 14, 0, 5, 0, 0},
-    {0, 0, 16, 0, 5, 0, 0},
-    {0, 0, 15, 0, 5, 0, 0},
-    {0, 0, 17, 0, 5, 0, 0},
-    {29, 0, 17, 0, 3, 0, 0},
-    {21, 0, 18, 0, 3, 0, 0},
-    {21, 0, 10, 0, 3, 0, 0},
-    {23, 0, 10, 0, 3, 0, 0},
+    {2, 0, 18, 0, 5, 102, 41},
+    {0, 0, 14, 0, 5, 0, 21},
+    {0, 0, 16, 0, 5, 0, 17},
+    {0, 0, 15, 0, 5, 0, 35},
+    {0, 0, 16, 0, 5, 0, 30},
+    {0, 0, 17, 0, 5, 0, 30},
+    {0, 0, 15, 0, 5, 0, 33},
+    {0, 0, 15, 0, 5, 0, 21},
+    {0, 0, 16, 0, 5, 0, 21},
+    {29, 0, 17, 0, 3, 0, 40},
+    {21, 0, 18, 0, 3, 0, 6},
+    {21, 0, 18, 0, 3, 0, 3},
+    {21, 0, 10, 0, 3, 0, 12},
+    {23, 0, 10, 0, 3, 0, 9},
+    {21, 0, 10, 0, 3, 0, 10},
+    {21, 0, 18, 0, 3, 0, 12},
     {22, 0, 18, 1, 3, 0, 0},
-    {18, 0, 18, 1, 3, 0, 0},
-    {25, 0, 9, 0, 3, 0, 0},
-    {21, 0, 12, 0, 3, 0, 0},
-    {17, 0, 9, 0, 3, 0, 0},
-    {13, 0, 8, 0, 3, 0, 0},
-    {25, 0, 18, 1, 3, 0, 0},
-    {25, 0, 18, 0, 3, 0, 0},
-    {9, 0, 0, 0, 3, 0, 1},
-    {24, 0, 18, 0, 3, 0, 0},
-    {16, 0, 18, 0, 3, 0, 0},
-    {5, 0, 0, 0, 3, 0, 1},
-    {29, 0, 12, 0, 5, 0, 0},
+    {18, 0, 18, 1, 3, 0, 2},
+    {25, 0, 9, 0, 3, 0, 9},
+    {21, 0, 12, 0, 3, 0, 8},
+    {17, 0, 9, 0, 3, 0, 16},
+    {21, 0, 12, 0, 3, 0, 7},
+    {13, 0, 8, 0, 3, 0, 11},
+    {21, 0, 18, 0, 3, 0, 8},
+    {25, 0, 18, 1, 3, 0, 12},
+    {25, 0, 18, 0, 3, 0, 12},
+    {9, 0, 0, 0, 3, 1, 12},
+    {21, 0, 18, 0, 3, 0, 9},
+    {24, 0, 18, 0, 3, 0, 12},
+    {16, 0, 18, 0, 3, 0, 12},
+    {5, 0, 0, 0, 3, 1, 12},
+    {25, 0, 18, 0, 3, 0, 17},
+    {18, 0, 18, 1, 3, 0, 1},
+    {0, 0, 15, 0, 5, 0, 36},
+    {29, 0, 12, 0, 5, 0, 4},
     {21, 0, 18, 0, 4, 0, 0},
-    {23, 0, 10, 0, 4, 0, 0},
-    {26, 0, 18, 0, 3, 0, 0},
-    {24, 0, 18, 0, 4, 0, 0},
-    {26, 0, 18, 0, 5, 0, 0},
-    {7, 0, 0, 0, 4, 0, 1},
-    {20, 0, 18, 1, 5, 0, 0},
-    {1, 0, 14, 0, 4, 0, 0},
-    {26, 0, 18, 0, 4, 0, 0},
-    {26, 0, 10, 0, 4, 0, 0},
-    {25, 0, 10, 0, 4, 0, 0},
-    {15, 0, 8, 0, 4, 0, 0},
-    {5, 0, 0, 0, 5, 0, 0},
-    {19, 0, 18, 1, 5, 0, 0},
-    {15, 0, 18, 0, 4, 0, 0},
-    {9, 0, 0, 0, 5, 0, 1},
-    {9, 0, 0, 0, 4, 0, 1},
-    {25, 0, 18, 0, 4, 0, 0},
-    {5, 0, 0, 0, 4, 0, 1},
-    {5, 0, 0, 0, 5, 0, 1},
-    {7, 0, 0, 0, 5, 0, 1},
-    {8, 0, 0, 0, 5, 0, 1},
-    {6, 0, 0, 0, 5, 0, 1},
-    {6, 0, 18, 0, 5, 0, 0},
-    {6, 0, 0, 0, 5, 0, 0},
-    {24, 0, 18, 0, 5, 0, 0},
-    {6, 0, 18, 0, 4, 0, 0},
-    {6, 0, 0, 0, 4, 0, 0},
-    {24, 0, 18, 0, 5, 0, 34},
-    {12, 230, 13, 0, 4, 0, 40},
-    {12, 232, 13, 0, 4, 0, 40},
-    {12, 220, 13, 0, 4, 0, 40},
-    {12, 216, 13, 0, 4, 0, 40},
-    {12, 202, 13, 0, 4, 0, 40},
-    {12, 1, 13, 0, 4, 0, 40},
-    {12, 240, 13, 0, 4, 0, 40},
-    {12, 0, 13, 0, 4, 0, 40},
-    {12, 233, 13, 0, 4, 0, 40},
-    {12, 234, 13, 0, 4, 0, 40},
-    {9, 0, 0, 0, 5, 0, 2},
-    {5, 0, 0, 0, 5, 0, 2},
-    {24, 0, 18, 0, 5, 0, 2},
-    {2, 0, 18, 0, 5, 0, 102},
-    {6, 0, 0, 0, 5, 0, 2},
-    {21, 0, 18, 0, 5, 0, 0},
-    {9, 0, 0, 0, 4, 0, 2},
-    {5, 0, 0, 0, 4, 0, 2},
-    {9, 0, 0, 0, 5, 0, 54},
-    {5, 0, 0, 0, 5, 0, 54},
-    {25, 0, 18, 0, 5, 0, 2},
-    {9, 0, 0, 0, 5, 0, 3},
-    {9, 0, 0, 0, 4, 0, 3},
-    {5, 0, 0, 0, 4, 0, 3},
-    {5, 0, 0, 0, 5, 0, 3},
-    {26, 0, 0, 0, 5, 0, 3},
-    {12, 230, 13, 0, 5, 0, 3},
-    {12, 230, 13, 0, 5, 0, 40},
-    {11, 0, 13, 0, 5, 0, 3},
-    {9, 0, 0, 0, 5, 0, 4},
-    {6, 0, 0, 0, 5, 0, 4},
-    {21, 0, 0, 0, 5, 0, 4},
-    {5, 0, 0, 0, 5, 0, 4},
-    {21, 0, 0, 0, 5, 0, 0},
-    {17, 0, 18, 0, 5, 0, 4},
-    {26, 0, 18, 0, 5, 0, 4},
-    {23, 0, 10, 0, 5, 0, 4},
-    {12, 220, 13, 0, 5, 0, 5},
-    {12, 230, 13, 0, 5, 0, 5},
-    {12, 222, 13, 0, 5, 0, 5},
-    {12, 228, 13, 0, 5, 0, 5},
-    {12, 10, 13, 0, 5, 0, 5},
-    {12, 11, 13, 0, 5, 0, 5},
-    {12, 12, 13, 0, 5, 0, 5},
-    {12, 13, 13, 0, 5, 0, 5},
-    {12, 14, 13, 0, 5, 0, 5},
-    {12, 15, 13, 0, 5, 0, 5},
-    {12, 16, 13, 0, 5, 0, 5},
-    {12, 17, 13, 0, 5, 0, 5},
-    {12, 18, 13, 0, 5, 0, 5},
-    {12, 19, 13, 0, 5, 0, 5},
-    {12, 20, 13, 0, 5, 0, 5},
-    {12, 21, 13, 0, 5, 0, 5},
-    {12, 22, 13, 0, 5, 0, 5},
-    {17, 0, 3, 0, 5, 0, 5},
-    {12, 23, 13, 0, 5, 0, 5},
-    {21, 0, 3, 0, 5, 0, 5},
-    {12, 24, 13, 0, 5, 0, 5},
-    {12, 25, 13, 0, 5, 0, 5},
-    {7, 0, 3, 0, 5, 0, 5},
-    {1, 0, 11, 0, 5, 0, 6},
-    {1, 0, 11, 0, 5, 0, 0},
-    {25, 0, 18, 0, 5, 0, 6},
-    {25, 0, 4, 0, 5, 0, 6},
-    {21, 0, 10, 0, 5, 0, 6},
-    {23, 0, 4, 0, 5, 0, 6},
-    {21, 0, 12, 0, 5, 0, 0},
+    {23, 0, 10, 0, 3, 0, 10},
+    {23, 0, 10, 0, 4, 0, 9},
+    {26, 0, 18, 0, 3, 0, 12},
+    {21, 0, 18, 0, 4, 0, 29},
+    {24, 0, 18, 0, 4, 0, 29},
+    {26, 0, 18, 0, 5, 0, 12},
+    {7, 0, 0, 0, 4, 1, 29},
+    {20, 0, 18, 1, 5, 0, 3},
+    {1, 0, 14, 0, 4, 0, 17},
+    {26, 0, 18, 0, 4, 0, 12},
+    {26, 0, 10, 0, 4, 0, 10},
+    {25, 0, 10, 0, 4, 0, 9},
+    {15, 0, 8, 0, 4, 0, 29},
+    {24, 0, 18, 0, 4, 0, 18},
+    {5, 0, 0, 0, 5, 0, 12},
+    {19, 0, 18, 1, 5, 0, 3},
+    {15, 0, 18, 0, 4, 0, 29},
+    {9, 0, 0, 0, 5, 1, 12},
+    {9, 0, 0, 0, 4, 1, 12},
+    {25, 0, 18, 0, 4, 0, 29},
+    {5, 0, 0, 0, 4, 1, 12},
+    {5, 0, 0, 0, 5, 1, 12},
+    {7, 0, 0, 0, 5, 1, 12},
+    {8, 0, 0, 0, 5, 1, 12},
+    {6, 0, 0, 0, 5, 1, 12},
+    {6, 0, 18, 0, 5, 0, 12},
+    {6, 0, 0, 0, 5, 0, 12},
+    {24, 0, 18, 0, 5, 0, 12},
+    {24, 0, 18, 0, 4, 0, 12},
+    {6, 0, 18, 0, 4, 0, 29},
+    {6, 0, 18, 0, 5, 0, 18},
+    {6, 0, 0, 0, 4, 0, 29},
+    {24, 0, 18, 0, 5, 34, 12},
+    {12, 230, 13, 0, 4, 40, 21},
+    {12, 232, 13, 0, 4, 40, 21},
+    {12, 220, 13, 0, 4, 40, 21},
+    {12, 216, 13, 0, 4, 40, 21},
+    {12, 202, 13, 0, 4, 40, 21},
+    {12, 1, 13, 0, 4, 40, 21},
+    {12, 240, 13, 0, 4, 40, 21},
+    {12, 0, 13, 0, 4, 40, 4},
+    {12, 233, 13, 0, 4, 40, 4},
+    {12, 234, 13, 0, 4, 40, 4},
+    {9, 0, 0, 0, 5, 2, 12},
+    {5, 0, 0, 0, 5, 2, 12},
+    {24, 0, 18, 0, 5, 2, 12},
+    {2, 0, 18, 0, 5, 102, 41},
+    {6, 0, 0, 0, 5, 2, 12},
+    {21, 0, 18, 0, 5, 0, 8},
+    {21, 0, 18, 0, 5, 0, 12},
+    {9, 0, 0, 0, 4, 2, 12},
+    {5, 0, 0, 0, 4, 2, 12},
+    {9, 0, 0, 0, 5, 54, 12},
+    {5, 0, 0, 0, 5, 54, 12},
+    {25, 0, 18, 0, 5, 2, 12},
+    {9, 0, 0, 0, 5, 3, 12},
+    {9, 0, 0, 0, 4, 3, 12},
+    {5, 0, 0, 0, 4, 3, 12},
+    {5, 0, 0, 0, 5, 3, 12},
+    {26, 0, 0, 0, 5, 3, 12},
+    {12, 230, 13, 0, 5, 3, 21},
+    {12, 230, 13, 0, 5, 40, 21},
+    {11, 0, 13, 0, 5, 3, 21},
+    {9, 0, 0, 0, 5, 4, 12},
+    {6, 0, 0, 0, 5, 4, 12},
+    {21, 0, 0, 0, 5, 4, 12},
+    {5, 0, 0, 0, 5, 4, 12},
+    {21, 0, 0, 0, 5, 0, 8},
+    {17, 0, 18, 0, 5, 4, 17},
+    {26, 0, 18, 0, 5, 4, 12},
+    {23, 0, 10, 0, 5, 4, 9},
+    {12, 220, 13, 0, 5, 5, 21},
+    {12, 230, 13, 0, 5, 5, 21},
+    {12, 222, 13, 0, 5, 5, 21},
+    {12, 228, 13, 0, 5, 5, 21},
+    {12, 10, 13, 0, 5, 5, 21},
+    {12, 11, 13, 0, 5, 5, 21},
+    {12, 12, 13, 0, 5, 5, 21},
+    {12, 13, 13, 0, 5, 5, 21},
+    {12, 14, 13, 0, 5, 5, 21},
+    {12, 15, 13, 0, 5, 5, 21},
+    {12, 16, 13, 0, 5, 5, 21},
+    {12, 17, 13, 0, 5, 5, 21},
+    {12, 18, 13, 0, 5, 5, 21},
+    {12, 19, 13, 0, 5, 5, 21},
+    {12, 20, 13, 0, 5, 5, 21},
+    {12, 21, 13, 0, 5, 5, 21},
+    {12, 22, 13, 0, 5, 5, 21},
+    {17, 0, 3, 0, 5, 5, 17},
+    {12, 23, 13, 0, 5, 5, 21},
+    {21, 0, 3, 0, 5, 5, 12},
+    {12, 24, 13, 0, 5, 5, 21},
+    {12, 25, 13, 0, 5, 5, 21},
+    {21, 0, 3, 0, 5, 5, 6},
+    {7, 0, 3, 0, 5, 5, 13},
+    {1, 0, 11, 0, 5, 6, 12},
+    {1, 0, 11, 0, 5, 0, 12},
+    {25, 0, 18, 0, 5, 6, 12},
+    {25, 0, 4, 0, 5, 6, 12},
+    {21, 0, 10, 0, 5, 6, 10},
+    {23, 0, 4, 0, 5, 6, 10},
+    {21, 0, 12, 0, 5, 0, 8},
+    {21, 0, 4, 0, 5, 6, 8},
+    {26, 0, 18, 0, 5, 6, 12},
+    {12, 230, 13, 0, 5, 6, 21},
+    {12, 30, 13, 0, 5, 6, 21},
+    {12, 31, 13, 0, 5, 6, 21},
+    {12, 32, 13, 0, 5, 6, 21},
     {21, 0, 4, 0, 5, 0, 6},
-    {26, 0, 18, 0, 5, 0, 6},
-    {12, 230, 13, 0, 5, 0, 6},
-    {12, 30, 13, 0, 5, 0, 6},
-    {12, 31, 13, 0, 5, 0, 6},
-    {12, 32, 13, 0, 5, 0, 6},
-    {21, 0, 4, 0, 5, 0, 0},
-    {1, 0, 4, 0, 5, 0, 0},
-    {7, 0, 4, 0, 5, 0, 6},
-    {6, 0, 4, 0, 5, 0, 0},
-    {12, 27, 13, 0, 5, 0, 40},
-    {12, 28, 13, 0, 5, 0, 40},
-    {12, 29, 13, 0, 5, 0, 40},
-    {12, 30, 13, 0, 5, 0, 40},
-    {12, 31, 13, 0, 5, 0, 40},
-    {12, 32, 13, 0, 5, 0, 40},
-    {12, 33, 13, 0, 5, 0, 40},
-    {12, 34, 13, 0, 5, 0, 40},
-    {12, 220, 13, 0, 5, 0, 40},
-    {12, 220, 13, 0, 5, 0, 6},
-    {13, 0, 11, 0, 5, 0, 6},
-    {21, 0, 11, 0, 5, 0, 6},
-    {12, 35, 13, 0, 5, 0, 40},
-    {6, 0, 4, 0, 5, 0, 6},
-    {13, 0, 8, 0, 5, 0, 6},
-    {26, 0, 4, 0, 5, 0, 6},
-    {21, 0, 4, 0, 5, 0, 7},
-    {1, 0, 4, 0, 5, 0, 7},
-    {7, 0, 4, 0, 5, 0, 7},
-    {12, 36, 13, 0, 5, 0, 7},
-    {12, 230, 13, 0, 5, 0, 7},
-    {12, 220, 13, 0, 5, 0, 7},
-    {7, 0, 4, 0, 5, 0, 8},
-    {12, 0, 13, 0, 5, 0, 8},
-    {13, 0, 3, 0, 5, 0, 65},
-    {7, 0, 3, 0, 5, 0, 65},
-    {12, 230, 13, 0, 5, 0, 65},
-    {12, 220, 13, 0, 5, 0, 65},
-    {6, 0, 3, 0, 5, 0, 65},
-    {26, 0, 18, 0, 5, 0, 65},
-    {21, 0, 18, 0, 5, 0, 65},
-    {7, 0, 3, 0, 5, 0, 81},
-    {12, 230, 13, 0, 5, 0, 81},
-    {6, 0, 3, 0, 5, 0, 81},
-    {21, 0, 3, 0, 5, 0, 81},
-    {7, 0, 3, 0, 5, 0, 94},
-    {12, 220, 13, 0, 5, 0, 94},
-    {21, 0, 3, 0, 5, 0, 94},
-    {12, 27, 13, 0, 5, 0, 6},
-    {12, 28, 13, 0, 5, 0, 6},
-    {12, 29, 13, 0, 5, 0, 6},
-    {12, 0, 13, 0, 5, 0, 9},
-    {10, 0, 0, 0, 5, 0, 9},
-    {7, 0, 0, 0, 5, 0, 9},
-    {12, 7, 13, 0, 5, 0, 9},
-    {12, 9, 13, 0, 5, 0, 9},
-    {12, 230, 13, 0, 5, 0, 9},
-    {13, 0, 0, 0, 5, 0, 9},
-    {21, 0, 0, 0, 5, 0, 9},
-    {6, 0, 0, 0, 5, 0, 9},
-    {7, 0, 0, 0, 5, 0, 10},
-    {12, 0, 13, 0, 5, 0, 10},
-    {10, 0, 0, 0, 5, 0, 10},
-    {12, 7, 13, 0, 5, 0, 10},
-    {12, 9, 13, 0, 5, 0, 10},
-    {13, 0, 0, 0, 5, 0, 10},
-    {23, 0, 10, 0, 5, 0, 10},
-    {15, 0, 0, 0, 5, 0, 10},
-    {26, 0, 0, 0, 5, 0, 10},
-    {12, 0, 13, 0, 5, 0, 11},
-    {10, 0, 0, 0, 5, 0, 11},
-    {7, 0, 0, 0, 5, 0, 11},
-    {12, 7, 13, 0, 5, 0, 11},
-    {12, 9, 13, 0, 5, 0, 11},
-    {13, 0, 0, 0, 5, 0, 11},
-    {12, 0, 13, 0, 5, 0, 12},
-    {10, 0, 0, 0, 5, 0, 12},
-    {7, 0, 0, 0, 5, 0, 12},
-    {12, 7, 13, 0, 5, 0, 12},
-    {12, 9, 13, 0, 5, 0, 12},
-    {13, 0, 0, 0, 5, 0, 12},
+    {1, 0, 4, 0, 5, 0, 21},
+    {21, 0, 4, 0, 5, 6, 6},
+    {7, 0, 4, 0, 5, 6, 12},
+    {6, 0, 4, 0, 5, 0, 12},
+    {12, 27, 13, 0, 5, 40, 21},
+    {12, 28, 13, 0, 5, 40, 21},
+    {12, 29, 13, 0, 5, 40, 21},
+    {12, 30, 13, 0, 5, 40, 21},
+    {12, 31, 13, 0, 5, 40, 21},
+    {12, 32, 13, 0, 5, 40, 21},
+    {12, 33, 13, 0, 5, 40, 21},
+    {12, 34, 13, 0, 5, 40, 21},
+    {12, 220, 13, 0, 5, 40, 21},
+    {12, 220, 13, 0, 5, 6, 21},
+    {13, 0, 11, 0, 5, 6, 11},
+    {21, 0, 11, 0, 5, 6, 11},
+    {21, 0, 4, 0, 5, 6, 12},
+    {12, 35, 13, 0, 5, 40, 21},
+    {6, 0, 4, 0, 5, 6, 12},
+    {13, 0, 8, 0, 5, 6, 11},
+    {26, 0, 4, 0, 5, 6, 12},
+    {21, 0, 4, 0, 5, 7, 12},
+    {1, 0, 4, 0, 5, 7, 12},
+    {7, 0, 4, 0, 5, 7, 12},
+    {12, 36, 13, 0, 5, 7, 21},
+    {12, 230, 13, 0, 5, 7, 21},
+    {12, 220, 13, 0, 5, 7, 21},
+    {7, 0, 4, 0, 5, 8, 12},
+    {12, 0, 13, 0, 5, 8, 21},
+    {13, 0, 3, 0, 5, 65, 11},
+    {7, 0, 3, 0, 5, 65, 12},
+    {12, 230, 13, 0, 5, 65, 21},
+    {12, 220, 13, 0, 5, 65, 21},
+    {6, 0, 3, 0, 5, 65, 12},
+    {26, 0, 18, 0, 5, 65, 12},
+    {21, 0, 18, 0, 5, 65, 12},
+    {21, 0, 18, 0, 5, 65, 8},
+    {21, 0, 18, 0, 5, 65, 6},
+    {7, 0, 3, 0, 5, 81, 12},
+    {12, 230, 13, 0, 5, 81, 21},
+    {6, 0, 3, 0, 5, 81, 12},
+    {21, 0, 3, 0, 5, 81, 12},
+    {7, 0, 3, 0, 5, 94, 12},
+    {12, 220, 13, 0, 5, 94, 21},
+    {21, 0, 3, 0, 5, 94, 12},
+    {12, 27, 13, 0, 5, 6, 21},
+    {12, 28, 13, 0, 5, 6, 21},
+    {12, 29, 13, 0, 5, 6, 21},
+    {12, 0, 13, 0, 5, 9, 21},
+    {10, 0, 0, 0, 5, 9, 21},
+    {7, 0, 0, 0, 5, 9, 12},
+    {12, 7, 13, 0, 5, 9, 21},
+    {12, 9, 13, 0, 5, 9, 21},
+    {12, 230, 13, 0, 5, 9, 21},
+    {21, 0, 0, 0, 5, 0, 17},
+    {13, 0, 0, 0, 5, 9, 11},
+    {21, 0, 0, 0, 5, 9, 12},
+    {6, 0, 0, 0, 5, 9, 12},
+    {7, 0, 0, 0, 5, 10, 12},
+    {12, 0, 13, 0, 5, 10, 21},
+    {10, 0, 0, 0, 5, 10, 21},
+    {12, 7, 13, 0, 5, 10, 21},
+    {12, 9, 13, 0, 5, 10, 21},
+    {13, 0, 0, 0, 5, 10, 11},
+    {23, 0, 10, 0, 5, 10, 10},
+    {15, 0, 0, 0, 5, 10, 12},
+    {15, 0, 0, 0, 5, 10, 10},
+    {26, 0, 0, 0, 5, 10, 12},
+    {23, 0, 10, 0, 5, 10, 9},
+    {12, 0, 13, 0, 5, 11, 21},
+    {10, 0, 0, 0, 5, 11, 21},
+    {7, 0, 0, 0, 5, 11, 12},
+    {12, 7, 13, 0, 5, 11, 21},
+    {12, 9, 13, 0, 5, 11, 21},
+    {13, 0, 0, 0, 5, 11, 11},
+    {12, 0, 13, 0, 5, 12, 21},
+    {10, 0, 0, 0, 5, 12, 21},
+    {7, 0, 0, 0, 5, 12, 12},
+    {12, 7, 13, 0, 5, 12, 21},
+    {12, 9, 13, 0, 5, 12, 21},
+    {13, 0, 0, 0, 5, 12, 11},
+    {21, 0, 0, 0, 5, 12, 12},
+    {23, 0, 10, 0, 5, 12, 9},
+    {12, 0, 13, 0, 5, 13, 21},
+    {10, 0, 0, 0, 5, 13, 21},
+    {7, 0, 0, 0, 5, 13, 12},
+    {12, 7, 13, 0, 5, 13, 21},
+    {12, 9, 13, 0, 5, 13, 21},
+    {13, 0, 0, 0, 5, 13, 11},
+    {26, 0, 0, 0, 5, 13, 12},
+    {15, 0, 0, 0, 5, 13, 12},
+    {12, 0, 13, 0, 5, 14, 21},
+    {7, 0, 0, 0, 5, 14, 12},
+    {10, 0, 0, 0, 5, 14, 21},
+    {12, 9, 13, 0, 5, 14, 21},
+    {13, 0, 0, 0, 5, 14, 11},
+    {15, 0, 0, 0, 5, 14, 12},
+    {26, 0, 18, 0, 5, 14, 12},
+    {23, 0, 10, 0, 5, 14, 9},
+    {12, 0, 13, 0, 5, 15, 21},
+    {10, 0, 0, 0, 5, 15, 21},
+    {7, 0, 0, 0, 5, 15, 12},
+    {12, 9, 13, 0, 5, 15, 21},
+    {12, 84, 13, 0, 5, 15, 21},
+    {12, 91, 13, 0, 5, 15, 21},
+    {13, 0, 0, 0, 5, 15, 11},
+    {15, 0, 18, 0, 5, 15, 12},
+    {26, 0, 0, 0, 5, 15, 12},
+    {7, 0, 0, 0, 5, 16, 12},
+    {12, 0, 13, 0, 5, 16, 21},
+    {10, 0, 0, 0, 5, 16, 21},
+    {12, 7, 13, 0, 5, 16, 21},
+    {12, 0, 0, 0, 5, 16, 21},
+    {12, 9, 13, 0, 5, 16, 21},
+    {13, 0, 0, 0, 5, 16, 11},
+    {12, 0, 13, 0, 5, 17, 21},
+    {10, 0, 0, 0, 5, 17, 21},
+    {7, 0, 0, 0, 5, 17, 12},
+    {12, 9, 13, 0, 5, 17, 21},
+    {26, 0, 0, 0, 5, 17, 12},
+    {15, 0, 0, 0, 5, 17, 12},
+    {13, 0, 0, 0, 5, 17, 11},
+    {26, 0, 0, 0, 5, 17, 10},
+    {10, 0, 0, 0, 5, 18, 21},
+    {7, 0, 0, 0, 5, 18, 12},
+    {12, 9, 13, 0, 5, 18, 21},
+    {12, 0, 13, 0, 5, 18, 21},
+    {13, 0, 0, 0, 5, 18, 11},
+    {21, 0, 0, 0, 5, 18, 12},
+    {7, 0, 0, 0, 5, 19, 38},
+    {12, 0, 13, 0, 5, 19, 38},
+    {12, 103, 13, 0, 5, 19, 38},
+    {12, 9, 13, 0, 5, 19, 38},
+    {23, 0, 10, 0, 5, 0, 9},
+    {6, 0, 0, 0, 5, 19, 38},
+    {12, 107, 13, 0, 5, 19, 38},
+    {21, 0, 0, 0, 5, 19, 12},
+    {13, 0, 0, 0, 5, 19, 11},
+    {21, 0, 0, 0, 5, 19, 17},
+    {7, 0, 0, 0, 5, 20, 38},
+    {12, 0, 13, 0, 5, 20, 38},
+    {12, 118, 13, 0, 5, 20, 38},
+    {6, 0, 0, 0, 5, 20, 38},
+    {12, 122, 13, 0, 5, 20, 38},
+    {13, 0, 0, 0, 5, 20, 11},
+    {7, 0, 0, 0, 5, 21, 12},
+    {26, 0, 0, 0, 5, 21, 18},
+    {21, 0, 0, 0, 5, 21, 18},
+    {21, 0, 0, 0, 5, 21, 12},
+    {21, 0, 0, 0, 5, 21, 4},
+    {21, 0, 0, 0, 5, 21, 17},
+    {21, 0, 0, 0, 5, 21, 6},
+    {26, 0, 0, 0, 5, 21, 12},
+    {12, 220, 13, 0, 5, 21, 21},
+    {13, 0, 0, 0, 5, 21, 11},
+    {15, 0, 0, 0, 5, 21, 12},
+    {26, 0, 0, 0, 5, 21, 17},
+    {12, 216, 13, 0, 5, 21, 21},
+    {22, 0, 18, 1, 5, 21, 0},
+    {18, 0, 18, 1, 5, 21, 1},
+    {10, 0, 0, 0, 5, 21, 21},
+    {12, 129, 13, 0, 5, 21, 21},
+    {12, 130, 13, 0, 5, 21, 21},
+    {12, 0, 13, 0, 5, 21, 21},
+    {12, 132, 13, 0, 5, 21, 21},
+    {10, 0, 0, 0, 5, 21, 17},
+    {12, 230, 13, 0, 5, 21, 21},
+    {12, 9, 13, 0, 5, 21, 21},
+    {26, 0, 0, 0, 5, 0, 12},
+    {7, 0, 0, 0, 5, 22, 38},
+    {10, 0, 0, 0, 5, 22, 38},
+    {12, 0, 13, 0, 5, 22, 38},
+    {12, 7, 13, 0, 5, 22, 38},
+    {12, 9, 13, 0, 5, 22, 38},
+    {13, 0, 0, 0, 5, 22, 11},
+    {21, 0, 0, 0, 5, 22, 17},
+    {21, 0, 0, 0, 5, 22, 12},
+    {12, 220, 13, 0, 5, 22, 38},
+    {26, 0, 0, 0, 5, 22, 38},
+    {9, 0, 0, 0, 5, 23, 12},
+    {7, 0, 0, 0, 5, 23, 12},
     {21, 0, 0, 0, 5, 0, 12},
-    {23, 0, 10, 0, 5, 0, 12},
-    {12, 0, 13, 0, 5, 0, 13},
-    {10, 0, 0, 0, 5, 0, 13},
-    {7, 0, 0, 0, 5, 0, 13},
-    {12, 7, 13, 0, 5, 0, 13},
-    {12, 9, 13, 0, 5, 0, 13},
-    {13, 0, 0, 0, 5, 0, 13},
-    {26, 0, 0, 0, 5, 0, 13},
-    {15, 0, 0, 0, 5, 0, 13},
-    {12, 0, 13, 0, 5, 0, 14},
-    {7, 0, 0, 0, 5, 0, 14},
-    {10, 0, 0, 0, 5, 0, 14},
-    {12, 9, 13, 0, 5, 0, 14},
-    {13, 0, 0, 0, 5, 0, 14},
-    {15, 0, 0, 0, 5, 0, 14},
-    {26, 0, 18, 0, 5, 0, 14},
-    {23, 0, 10, 0, 5, 0, 14},
-    {12, 0, 13, 0, 5, 0, 15},
-    {10, 0, 0, 0, 5, 0, 15},
-    {7, 0, 0, 0, 5, 0, 15},
-    {12, 9, 13, 0, 5, 0, 15},
-    {12, 84, 13, 0, 5, 0, 15},
-    {12, 91, 13, 0, 5, 0, 15},
-    {13, 0, 0, 0, 5, 0, 15},
-    {15, 0, 18, 0, 5, 0, 15},
-    {26, 0, 0, 0, 5, 0, 15},
-    {12, 0, 13, 0, 5, 0, 16},
-    {10, 0, 0, 0, 5, 0, 16},
-    {7, 0, 0, 0, 5, 0, 16},
-    {12, 7, 13, 0, 5, 0, 16},
-    {12, 0, 0, 0, 5, 0, 16},
-    {12, 9, 13, 0, 5, 0, 16},
-    {13, 0, 0, 0, 5, 0, 16},
-    {12, 0, 13, 0, 5, 0, 17},
-    {10, 0, 0, 0, 5, 0, 17},
-    {7, 0, 0, 0, 5, 0, 17},
-    {12, 9, 13, 0, 5, 0, 17},
-    {13, 0, 0, 0, 5, 0, 17},
-    {15, 0, 0, 0, 5, 0, 17},
-    {26, 0, 0, 0, 5, 0, 17},
-    {10, 0, 0, 0, 5, 0, 18},
-    {7, 0, 0, 0, 5, 0, 18},
-    {12, 9, 13, 0, 5, 0, 18},
-    {12, 0, 13, 0, 5, 0, 18},
-    {13, 0, 0, 0, 5, 0, 18},
-    {21, 0, 0, 0, 5, 0, 18},
-    {7, 0, 0, 0, 5, 0, 19},
-    {12, 0, 13, 0, 5, 0, 19},
-    {12, 103, 13, 0, 5, 0, 19},
-    {12, 9, 13, 0, 5, 0, 19},
-    {23, 0, 10, 0, 5, 0, 0},
-    {6, 0, 0, 0, 5, 0, 19},
-    {12, 107, 13, 0, 5, 0, 19},
-    {21, 0, 0, 0, 5, 0, 19},
-    {13, 0, 0, 0, 5, 0, 19},
-    {7, 0, 0, 0, 5, 0, 20},
-    {12, 0, 13, 0, 5, 0, 20},
-    {12, 118, 13, 0, 5, 0, 20},
-    {6, 0, 0, 0, 5, 0, 20},
-    {12, 122, 13, 0, 5, 0, 20},
-    {13, 0, 0, 0, 5, 0, 20},
-    {7, 0, 0, 0, 5, 0, 21},
-    {26, 0, 0, 0, 5, 0, 21},
-    {21, 0, 0, 0, 5, 0, 21},
-    {12, 220, 13, 0, 5, 0, 21},
-    {13, 0, 0, 0, 5, 0, 21},
-    {15, 0, 0, 0, 5, 0, 21},
-    {12, 216, 13, 0, 5, 0, 21},
-    {22, 0, 18, 1, 5, 0, 21},
-    {18, 0, 18, 1, 5, 0, 21},
+    {6, 0, 0, 0, 5, 23, 12},
+    {7, 0, 0, 0, 2, 24, 25},
+    {7, 0, 0, 0, 5, 24, 26},
+    {7, 0, 0, 0, 5, 24, 27},
+    {7, 0, 0, 0, 5, 25, 12},
+    {12, 230, 13, 0, 5, 25, 21},
+    {21, 0, 0, 0, 5, 25, 12},
+    {21, 0, 0, 0, 5, 25, 17},
+    {15, 0, 0, 0, 5, 25, 12},
+    {26, 0, 18, 0, 5, 25, 12},
+    {9, 0, 0, 0, 5, 26, 12},
+    {5, 0, 0, 0, 5, 26, 12},
+    {17, 0, 18, 0, 5, 27, 17},
+    {7, 0, 0, 0, 5, 27, 12},
+    {21, 0, 0, 0, 5, 27, 12},
+    {29, 0, 17, 0, 5, 28, 17},
+    {7, 0, 0, 0, 5, 28, 12},
+    {22, 0, 18, 1, 5, 28, 0},
+    {18, 0, 18, 1, 5, 28, 1},
+    {7, 0, 0, 0, 5, 29, 12},
+    {14, 0, 0, 0, 5, 29, 12},
+    {7, 0, 0, 0, 5, 41, 12},
+    {12, 0, 13, 0, 5, 41, 21},
+    {12, 9, 13, 0, 5, 41, 21},
+    {7, 0, 0, 0, 5, 42, 12},
+    {12, 0, 13, 0, 5, 42, 21},
+    {12, 9, 13, 0, 5, 42, 21},
+    {7, 0, 0, 0, 5, 43, 12},
+    {12, 0, 13, 0, 5, 43, 21},
+    {7, 0, 0, 0, 5, 44, 12},
+    {12, 0, 13, 0, 5, 44, 21},
+    {7, 0, 0, 0, 5, 30, 38},
+    {12, 0, 13, 0, 5, 30, 38},
+    {10, 0, 0, 0, 5, 30, 38},
+    {12, 9, 13, 0, 5, 30, 38},
+    {21, 0, 0, 0, 5, 30, 17},
+    {21, 0, 0, 0, 5, 30, 5},
+    {6, 0, 0, 0, 5, 30, 38},
+    {21, 0, 0, 0, 5, 30, 12},
+    {23, 0, 10, 0, 5, 30, 9},
+    {12, 230, 13, 0, 5, 30, 38},
+    {13, 0, 0, 0, 5, 30, 11},
+    {15, 0, 18, 0, 5, 30, 12},
+    {21, 0, 18, 0, 5, 31, 12},
+    {21, 0, 18, 0, 5, 0, 6},
+    {21, 0, 18, 0, 5, 31, 17},
+    {21, 0, 18, 0, 5, 0, 17},
+    {17, 0, 18, 0, 5, 31, 18},
+    {21, 0, 18, 0, 5, 31, 6},
+    {12, 0, 13, 0, 5, 31, 21},
+    {1, 0, 14, 0, 5, 31, 4},
+    {13, 0, 0, 0, 5, 31, 11},
+    {7, 0, 0, 0, 5, 31, 12},
+    {6, 0, 0, 0, 5, 31, 12},
+    {12, 228, 13, 0, 5, 31, 21},
+    {7, 0, 0, 0, 5, 45, 12},
+    {12, 0, 13, 0, 5, 45, 21},
+    {10, 0, 0, 0, 5, 45, 21},
+    {12, 222, 13, 0, 5, 45, 21},
+    {12, 230, 13, 0, 5, 45, 21},
+    {12, 220, 13, 0, 5, 45, 21},
+    {26, 0, 18, 0, 5, 45, 12},
+    {21, 0, 18, 0, 5, 45, 6},
+    {13, 0, 0, 0, 5, 45, 11},
+    {7, 0, 0, 0, 5, 46, 38},
+    {7, 0, 0, 0, 5, 55, 38},
+    {13, 0, 0, 0, 5, 55, 11},
+    {15, 0, 0, 0, 5, 55, 38},
+    {26, 0, 18, 0, 5, 55, 38},
+    {26, 0, 18, 0, 5, 30, 12},
+    {7, 0, 0, 0, 5, 53, 12},
+    {12, 230, 13, 0, 5, 53, 21},
+    {12, 220, 13, 0, 5, 53, 21},
+    {10, 0, 0, 0, 5, 53, 21},
+    {12, 0, 13, 0, 5, 53, 21},
+    {21, 0, 0, 0, 5, 53, 12},
+    {7, 0, 0, 0, 5, 77, 38},
+    {10, 0, 0, 0, 5, 77, 38},
+    {12, 0, 13, 0, 5, 77, 38},
+    {12, 9, 13, 0, 5, 77, 38},
+    {12, 230, 13, 0, 5, 77, 38},
+    {12, 220, 13, 0, 5, 77, 21},
+    {13, 0, 0, 0, 5, 77, 11},
+    {21, 0, 0, 0, 5, 77, 38},
+    {6, 0, 0, 0, 5, 77, 38},
+    {11, 0, 13, 0, 5, 40, 21},
+    {12, 0, 13, 0, 5, 61, 21},
+    {10, 0, 0, 0, 5, 61, 21},
+    {7, 0, 0, 0, 5, 61, 12},
+    {12, 7, 13, 0, 5, 61, 21},
+    {10, 9, 0, 0, 5, 61, 21},
+    {13, 0, 0, 0, 5, 61, 11},
+    {21, 0, 0, 0, 5, 61, 17},
+    {21, 0, 0, 0, 5, 61, 12},
+    {26, 0, 0, 0, 5, 61, 12},
+    {12, 230, 13, 0, 5, 61, 21},
+    {12, 220, 13, 0, 5, 61, 21},
+    {12, 0, 13, 0, 5, 66, 21},
+    {10, 0, 0, 0, 5, 66, 21},
+    {7, 0, 0, 0, 5, 66, 12},
+    {10, 9, 0, 0, 5, 66, 21},
+    {12, 9, 13, 0, 5, 66, 21},
+    {13, 0, 0, 0, 5, 66, 11},
+    {7, 0, 0, 0, 5, 92, 12},
+    {12, 7, 13, 0, 5, 92, 21},
+    {10, 0, 0, 0, 5, 92, 21},
+    {12, 0, 13, 0, 5, 92, 21},
+    {10, 9, 0, 0, 5, 92, 21},
+    {21, 0, 0, 0, 5, 92, 12},
+    {7, 0, 0, 0, 5, 67, 12},
+    {10, 0, 0, 0, 5, 67, 21},
+    {12, 0, 13, 0, 5, 67, 21},
+    {12, 7, 13, 0, 5, 67, 21},
+    {21, 0, 0, 0, 5, 67, 17},
+    {13, 0, 0, 0, 5, 67, 11},
+    {13, 0, 0, 0, 5, 68, 11},
+    {7, 0, 0, 0, 5, 68, 12},
+    {6, 0, 0, 0, 5, 68, 12},
+    {21, 0, 0, 0, 5, 68, 17},
+    {21, 0, 0, 0, 5, 66, 12},
+    {12, 1, 13, 0, 5, 40, 21},
     {10, 0, 0, 0, 5, 0, 21},
-    {12, 129, 13, 0, 5, 0, 21},
-    {12, 130, 13, 0, 5, 0, 21},
-    {12, 0, 13, 0, 5, 0, 21},
-    {12, 132, 13, 0, 5, 0, 21},
-    {12, 230, 13, 0, 5, 0, 21},
-    {12, 9, 13, 0, 5, 0, 21},
-    {26, 0, 0, 0, 5, 0, 0},
-    {7, 0, 0, 0, 5, 0, 22},
-    {10, 0, 0, 0, 5, 0, 22},
-    {12, 0, 13, 0, 5, 0, 22},
-    {12, 7, 13, 0, 5, 0, 22},
-    {12, 9, 13, 0, 5, 0, 22},
-    {13, 0, 0, 0, 5, 0, 22},
-    {21, 0, 0, 0, 5, 0, 22},
-    {12, 220, 13, 0, 5, 0, 22},
-    {26, 0, 0, 0, 5, 0, 22},
-    {9, 0, 0, 0, 5, 0, 23},
-    {7, 0, 0, 0, 5, 0, 23},
-    {6, 0, 0, 0, 5, 0, 23},
-    {7, 0, 0, 0, 2, 0, 24},
-    {7, 0, 0, 0, 5, 0, 24},
-    {7, 0, 0, 0, 5, 0, 25},
-    {12, 230, 13, 0, 5, 0, 25},
-    {21, 0, 0, 0, 5, 0, 25},
-    {15, 0, 0, 0, 5, 0, 25},
-    {26, 0, 18, 0, 5, 0, 25},
-    {9, 0, 0, 0, 5, 0, 26},
-    {5, 0, 0, 0, 5, 0, 26},
-    {17, 0, 18, 0, 5, 0, 27},
-    {7, 0, 0, 0, 5, 0, 27},
-    {21, 0, 0, 0, 5, 0, 27},
-    {29, 0, 17, 0, 5, 0, 28},
-    {7, 0, 0, 0, 5, 0, 28},
-    {22, 0, 18, 1, 5, 0, 28},
-    {18, 0, 18, 1, 5, 0, 28},
-    {7, 0, 0, 0, 5, 0, 29},
-    {14, 0, 0, 0, 5, 0, 29},
-    {7, 0, 0, 0, 5, 0, 41},
-    {12, 0, 13, 0, 5, 0, 41},
-    {12, 9, 13, 0, 5, 0, 41},
-    {7, 0, 0, 0, 5, 0, 42},
-    {12, 0, 13, 0, 5, 0, 42},
-    {12, 9, 13, 0, 5, 0, 42},
-    {7, 0, 0, 0, 5, 0, 43},
-    {12, 0, 13, 0, 5, 0, 43},
-    {7, 0, 0, 0, 5, 0, 44},
-    {12, 0, 13, 0, 5, 0, 44},
-    {7, 0, 0, 0, 5, 0, 30},
-    {12, 0, 13, 0, 5, 0, 30},
-    {10, 0, 0, 0, 5, 0, 30},
-    {12, 9, 13, 0, 5, 0, 30},
-    {21, 0, 0, 0, 5, 0, 30},
-    {6, 0, 0, 0, 5, 0, 30},
-    {23, 0, 10, 0, 5, 0, 30},
-    {12, 230, 13, 0, 5, 0, 30},
-    {13, 0, 0, 0, 5, 0, 30},
-    {15, 0, 18, 0, 5, 0, 30},
-    {21, 0, 18, 0, 5, 0, 31},
-    {17, 0, 18, 0, 5, 0, 31},
-    {12, 0, 13, 0, 5, 0, 31},
-    {1, 0, 14, 0, 5, 0, 31},
-    {13, 0, 0, 0, 5, 0, 31},
-    {7, 0, 0, 0, 5, 0, 31},
-    {6, 0, 0, 0, 5, 0, 31},
-    {12, 228, 13, 0, 5, 0, 31},
-    {7, 0, 0, 0, 5, 0, 45},
-    {12, 0, 13, 0, 5, 0, 45},
-    {10, 0, 0, 0, 5, 0, 45},
-    {12, 222, 13, 0, 5, 0, 45},
-    {12, 230, 13, 0, 5, 0, 45},
-    {12, 220, 13, 0, 5, 0, 45},
-    {26, 0, 18, 0, 5, 0, 45},
-    {21, 0, 18, 0, 5, 0, 45},
-    {13, 0, 0, 0, 5, 0, 45},
-    {7, 0, 0, 0, 5, 0, 46},
-    {7, 0, 0, 0, 5, 0, 55},
-    {13, 0, 0, 0, 5, 0, 55},
-    {15, 0, 0, 0, 5, 0, 55},
-    {26, 0, 18, 0, 5, 0, 55},
-    {26, 0, 18, 0, 5, 0, 30},
-    {7, 0, 0, 0, 5, 0, 53},
-    {12, 230, 13, 0, 5, 0, 53},
-    {12, 220, 13, 0, 5, 0, 53},
-    {10, 0, 0, 0, 5, 0, 53},
-    {12, 0, 13, 0, 5, 0, 53},
-    {21, 0, 0, 0, 5, 0, 53},
-    {7, 0, 0, 0, 5, 0, 77},
-    {10, 0, 0, 0, 5, 0, 77},
-    {12, 0, 13, 0, 5, 0, 77},
-    {12, 9, 13, 0, 5, 0, 77},
-    {12, 230, 13, 0, 5, 0, 77},
-    {12, 220, 13, 0, 5, 0, 77},
-    {13, 0, 0, 0, 5, 0, 77},
-    {21, 0, 0, 0, 5, 0, 77},
-    {6, 0, 0, 0, 5, 0, 77},
-    {11, 0, 13, 0, 5, 0, 40},
-    {12, 0, 13, 0, 5, 0, 61},
-    {10, 0, 0, 0, 5, 0, 61},
-    {7, 0, 0, 0, 5, 0, 61},
-    {12, 7, 13, 0, 5, 0, 61},
-    {10, 9, 0, 0, 5, 0, 61},
-    {13, 0, 0, 0, 5, 0, 61},
-    {21, 0, 0, 0, 5, 0, 61},
-    {26, 0, 0, 0, 5, 0, 61},
-    {12, 230, 13, 0, 5, 0, 61},
-    {12, 220, 13, 0, 5, 0, 61},
-    {12, 0, 13, 0, 5, 0, 66},
-    {10, 0, 0, 0, 5, 0, 66},
-    {7, 0, 0, 0, 5, 0, 66},
-    {10, 9, 0, 0, 5, 0, 66},
-    {12, 9, 13, 0, 5, 0, 66},
-    {13, 0, 0, 0, 5, 0, 66},
-    {7, 0, 0, 0, 5, 0, 92},
-    {12, 7, 13, 0, 5, 0, 92},
-    {10, 0, 0, 0, 5, 0, 92},
-    {12, 0, 13, 0, 5, 0, 92},
-    {10, 9, 0, 0, 5, 0, 92},
-    {21, 0, 0, 0, 5, 0, 92},
-    {7, 0, 0, 0, 5, 0, 67},
-    {10, 0, 0, 0, 5, 0, 67},
-    {12, 0, 13, 0, 5, 0, 67},
-    {12, 7, 13, 0, 5, 0, 67},
-    {21, 0, 0, 0, 5, 0, 67},
-    {13, 0, 0, 0, 5, 0, 67},
-    {13, 0, 0, 0, 5, 0, 68},
-    {7, 0, 0, 0, 5, 0, 68},
-    {6, 0, 0, 0, 5, 0, 68},
-    {21, 0, 0, 0, 5, 0, 68},
-    {21, 0, 0, 0, 5, 0, 66},
-    {12, 1, 13, 0, 5, 0, 40},
-    {10, 0, 0, 0, 5, 0, 0},
-    {7, 0, 0, 0, 5, 0, 0},
-    {6, 0, 0, 0, 5, 0, 3},
-    {12, 234, 13, 0, 5, 0, 40},
-    {12, 214, 13, 0, 5, 0, 40},
-    {12, 202, 13, 0, 5, 0, 40},
-    {12, 233, 13, 0, 5, 0, 40},
-    {8, 0, 0, 0, 5, 0, 2},
-    {29, 0, 17, 0, 5, 0, 0},
-    {1, 0, 14, 0, 5, 0, 0},
-    {1, 0, 14, 0, 5, 0, 40},
-    {1, 0, 0, 0, 5, 0, 0},
-    {1, 0, 3, 0, 5, 0, 0},
-    {17, 0, 18, 0, 4, 0, 0},
-    {17, 0, 18, 0, 5, 0, 0},
-    {20, 0, 18, 0, 4, 0, 0},
-    {19, 0, 18, 0, 4, 0, 0},
+    {7, 0, 0, 0, 5, 0, 12},
+    {6, 0, 0, 0, 5, 3, 12},
+    {12, 234, 13, 0, 5, 40, 21},
+    {12, 214, 13, 0, 5, 40, 21},
+    {12, 202, 13, 0, 5, 40, 21},
+    {12, 233, 13, 0, 5, 40, 21},
+    {8, 0, 0, 0, 5, 2, 12},
+    {24, 0, 18, 0, 5, 2, 18},
+    {29, 0, 17, 0, 5, 0, 17},
+    {29, 0, 17, 0, 5, 0, 4},
+    {1, 0, 14, 0, 5, 0, 20},
+    {1, 0, 14, 0, 5, 40, 21},
+    {1, 0, 14, 0, 5, 40, 41},
+    {1, 0, 0, 0, 5, 0, 21},
+    {1, 0, 3, 0, 5, 0, 21},
+    {17, 0, 18, 0, 4, 0, 17},
+    {17, 0, 18, 0, 5, 0, 4},
+    {17, 0, 18, 0, 5, 0, 17},
+    {17, 0, 18, 0, 4, 0, 19},
+    {17, 0, 18, 0, 4, 0, 29},
+    {20, 0, 18, 0, 4, 0, 3},
+    {19, 0, 18, 0, 4, 0, 3},
     {22, 0, 18, 0, 5, 0, 0},
-    {20, 0, 18, 0, 5, 0, 0},
-    {27, 0, 17, 0, 5, 0, 0},
-    {28, 0, 15, 0, 5, 0, 0},
-    {1, 0, 1, 0, 5, 0, 0},
-    {1, 0, 5, 0, 5, 0, 0},
-    {1, 0, 7, 0, 5, 0, 0},
-    {1, 0, 2, 0, 5, 0, 0},
-    {1, 0, 6, 0, 5, 0, 0},
-    {21, 0, 10, 0, 4, 0, 0},
-    {21, 0, 10, 0, 5, 0, 0},
-    {16, 0, 18, 0, 5, 0, 0},
-    {25, 0, 12, 0, 5, 0, 0},
+    {20, 0, 18, 0, 5, 0, 3},
+    {21, 0, 18, 0, 4, 0, 12},
+    {21, 0, 18, 0, 4, 0, 15},
+    {21, 0, 18, 0, 4, 0, 17},
+    {27, 0, 17, 0, 5, 0, 30},
+    {28, 0, 15, 0, 5, 0, 30},
+    {1, 0, 1, 0, 5, 0, 21},
+    {1, 0, 5, 0, 5, 0, 21},
+    {1, 0, 7, 0, 5, 0, 21},
+    {1, 0, 2, 0, 5, 0, 21},
+    {1, 0, 6, 0, 5, 0, 21},
+    {21, 0, 10, 0, 4, 0, 10},
+    {21, 0, 10, 0, 5, 0, 10},
+    {21, 0, 18, 0, 4, 0, 10},
+    {21, 0, 18, 0, 5, 0, 10},
+    {21, 0, 18, 0, 5, 0, 5},
+    {16, 0, 18, 0, 5, 0, 12},
+    {25, 0, 12, 0, 5, 0, 8},
     {22, 0, 18, 1, 5, 0, 0},
-    {18, 0, 18, 1, 5, 0, 0},
-    {25, 0, 18, 0, 5, 0, 0},
-    {1, 0, 19, 0, 5, 0, 0},
-    {1, 0, 20, 0, 5, 0, 0},
-    {1, 0, 21, 0, 5, 0, 0},
-    {1, 0, 22, 0, 5, 0, 0},
-    {15, 0, 8, 0, 5, 0, 0},
-    {25, 0, 9, 0, 5, 0, 0},
-    {6, 0, 0, 0, 4, 0, 1},
-    {23, 0, 10, 0, 1, 0, 0},
-    {9, 0, 0, 0, 5, 0, 0},
-    {5, 0, 0, 0, 4, 0, 0},
-    {26, 0, 10, 0, 5, 0, 0},
-    {25, 0, 18, 1, 5, 0, 0},
-    {15, 0, 18, 0, 5, 0, 0},
-    {14, 0, 0, 0, 4, 0, 1},
-    {14, 0, 0, 0, 5, 0, 1},
-    {25, 0, 18, 1, 4, 0, 0},
-    {25, 0, 10, 0, 5, 0, 0},
+    {18, 0, 18, 1, 5, 0, 1},
+    {25, 0, 18, 0, 5, 0, 12},
+    {1, 0, 14, 0, 5, 0, 22},
+    {1, 0, 14, 0, 5, 0, 12},
+    {1, 0, 19, 0, 5, 0, 21},
+    {1, 0, 20, 0, 5, 0, 21},
+    {1, 0, 21, 0, 5, 0, 21},
+    {1, 0, 22, 0, 5, 0, 21},
+    {1, 0, 14, 0, 5, 0, 21},
+    {15, 0, 8, 0, 5, 0, 12},
+    {25, 0, 9, 0, 5, 0, 12},
+    {6, 0, 0, 0, 4, 1, 29},
+    {23, 0, 10, 0, 5, 0, 10},
+    {23, 0, 10, 0, 1, 0, 9},
+    {2, 0, 18, 0, 5, 102, 9},
+    {9, 0, 0, 0, 5, 0, 12},
+    {26, 0, 18, 0, 4, 0, 10},
+    {26, 0, 18, 0, 4, 0, 29},
+    {5, 0, 0, 0, 4, 0, 29},
+    {26, 0, 18, 0, 4, 0, 9},
+    {9, 0, 0, 0, 4, 1, 29},
+    {26, 0, 10, 0, 5, 0, 12},
+    {25, 0, 18, 1, 5, 0, 12},
+    {15, 0, 18, 0, 5, 0, 12},
+    {15, 0, 18, 0, 4, 0, 12},
+    {15, 0, 18, 0, 5, 0, 29},
+    {14, 0, 0, 0, 4, 1, 29},
+    {14, 0, 0, 0, 5, 1, 12},
+    {25, 0, 18, 1, 4, 0, 29},
+    {25, 0, 9, 0, 5, 0, 9},
+    {25, 0, 10, 0, 5, 0, 9},
+    {25, 0, 18, 0, 5, 0, 15},
+    {26, 0, 18, 0, 2, 0, 14},
     {22, 0, 18, 1, 2, 0, 0},
-    {18, 0, 18, 1, 2, 0, 0},
-    {26, 0, 0, 0, 4, 0, 0},
-    {26, 0, 0, 0, 5, 0, 52},
-    {9, 0, 0, 0, 5, 0, 56},
-    {5, 0, 0, 0, 5, 0, 56},
-    {26, 0, 18, 0, 5, 0, 54},
-    {12, 230, 13, 0, 5, 0, 54},
-    {21, 0, 18, 0, 5, 0, 54},
-    {15, 0, 18, 0, 5, 0, 54},
-    {5, 0, 0, 0, 5, 0, 23},
-    {7, 0, 0, 0, 5, 0, 57},
-    {6, 0, 0, 0, 5, 0, 57},
-    {21, 0, 0, 0, 5, 0, 57},
-    {12, 9, 13, 0, 5, 0, 57},
-    {26, 0, 18, 0, 2, 0, 35},
-    {26, 0, 18, 0, 2, 0, 0},
-    {29, 0, 17, 0, 0, 0, 0},
-    {21, 0, 18, 0, 2, 0, 0},
-    {6, 0, 0, 0, 2, 0, 35},
-    {7, 0, 0, 0, 2, 0, 0},
-    {14, 0, 0, 0, 2, 0, 35},
-    {17, 0, 18, 0, 2, 0, 0},
-    {22, 0, 18, 0, 2, 0, 0},
-    {18, 0, 18, 0, 2, 0, 0},
-    {12, 218, 13, 0, 2, 0, 40},
-    {12, 228, 13, 0, 2, 0, 40},
-    {12, 232, 13, 0, 2, 0, 40},
-    {12, 222, 13, 0, 2, 0, 40},
-    {10, 224, 0, 0, 2, 0, 24},
-    {6, 0, 0, 0, 2, 0, 0},
-    {7, 0, 0, 0, 2, 0, 32},
-    {12, 8, 13, 0, 2, 0, 40},
-    {24, 0, 18, 0, 2, 0, 0},
-    {6, 0, 0, 0, 2, 0, 32},
-    {7, 0, 0, 0, 2, 0, 33},
-    {6, 0, 0, 0, 2, 0, 33},
-    {7, 0, 0, 0, 2, 0, 34},
-    {26, 0, 0, 0, 2, 0, 0},
-    {15, 0, 0, 0, 2, 0, 0},
-    {26, 0, 0, 0, 2, 0, 24},
-    {26, 0, 18, 0, 2, 0, 24},
-    {15, 0, 0, 0, 4, 0, 0},
-    {15, 0, 18, 0, 2, 0, 0},
-    {26, 0, 0, 0, 2, 0, 33},
-    {7, 0, 0, 0, 2, 0, 35},
-    {2, 0, 18, 0, 2, 0, 102},
-    {7, 0, 0, 0, 2, 0, 36},
-    {6, 0, 0, 0, 2, 0, 36},
-    {26, 0, 18, 0, 2, 0, 36},
-    {7, 0, 0, 0, 5, 0, 82},
-    {6, 0, 0, 0, 5, 0, 82},
-    {21, 0, 0, 0, 5, 0, 82},
-    {7, 0, 0, 0, 5, 0, 69},
-    {6, 0, 0, 0, 5, 0, 69},
-    {21, 0, 18, 0, 5, 0, 69},
-    {13, 0, 0, 0, 5, 0, 69},
-    {7, 0, 0, 0, 5, 0, 3},
+    {18, 0, 18, 1, 2, 0, 1},
+    {26, 0, 18, 0, 2, 0, 12},
+    {26, 0, 18, 0, 5, 0, 14},
+    {26, 0, 0, 0, 4, 0, 29},
+    {26, 0, 18, 0, 5, 0, 29},
+    {25, 0, 18, 0, 2, 0, 12},
+    {26, 0, 18, 0, 4, 0, 14},
+    {26, 0, 18, 0, 5, 0, 41},
+    {26, 0, 18, 0, 4, 0, 41},
+    {26, 0, 18, 0, 2, 0, 41},
+    {26, 0, 18, 0, 2, 0, 29},
+    {26, 0, 18, 0, 5, 0, 3},
+    {26, 0, 18, 0, 5, 0, 6},
+    {26, 0, 0, 0, 5, 52, 12},
+    {9, 0, 0, 0, 5, 56, 12},
+    {5, 0, 0, 0, 5, 56, 12},
+    {26, 0, 18, 0, 5, 54, 12},
+    {12, 230, 13, 0, 5, 54, 21},
+    {21, 0, 18, 0, 5, 54, 6},
+    {21, 0, 18, 0, 5, 54, 17},
+    {15, 0, 18, 0, 5, 54, 12},
+    {5, 0, 0, 0, 5, 23, 12},
+    {7, 0, 0, 0, 5, 57, 12},
+    {6, 0, 0, 0, 5, 57, 12},
+    {21, 0, 0, 0, 5, 57, 17},
+    {12, 9, 13, 0, 5, 57, 21},
     {21, 0, 18, 0, 5, 0, 3},
-    {6, 0, 18, 0, 5, 0, 3},
-    {7, 0, 0, 0, 5, 0, 83},
-    {14, 0, 0, 0, 5, 0, 83},
-    {12, 230, 13, 0, 5, 0, 83},
-    {21, 0, 0, 0, 5, 0, 83},
-    {24, 0, 0, 0, 5, 0, 0},
-    {7, 0, 0, 0, 5, 0, 58},
-    {12, 0, 13, 0, 5, 0, 58},
-    {12, 9, 13, 0, 5, 0, 58},
-    {10, 0, 0, 0, 5, 0, 58},
-    {26, 0, 18, 0, 5, 0, 58},
-    {15, 0, 0, 0, 5, 0, 0},
-    {7, 0, 0, 0, 5, 0, 64},
-    {21, 0, 18, 0, 5, 0, 64},
-    {10, 0, 0, 0, 5, 0, 70},
-    {7, 0, 0, 0, 5, 0, 70},
-    {12, 9, 13, 0, 5, 0, 70},
-    {21, 0, 0, 0, 5, 0, 70},
-    {13, 0, 0, 0, 5, 0, 70},
-    {13, 0, 0, 0, 5, 0, 71},
-    {7, 0, 0, 0, 5, 0, 71},
-    {12, 0, 13, 0, 5, 0, 71},
-    {12, 220, 13, 0, 5, 0, 71},
-    {21, 0, 0, 0, 5, 0, 71},
-    {7, 0, 0, 0, 5, 0, 72},
-    {12, 0, 13, 0, 5, 0, 72},
-    {10, 0, 0, 0, 5, 0, 72},
-    {10, 9, 0, 0, 5, 0, 72},
-    {21, 0, 0, 0, 5, 0, 72},
-    {12, 0, 13, 0, 5, 0, 84},
-    {10, 0, 0, 0, 5, 0, 84},
-    {7, 0, 0, 0, 5, 0, 84},
-    {12, 7, 13, 0, 5, 0, 84},
-    {10, 9, 0, 0, 5, 0, 84},
-    {21, 0, 0, 0, 5, 0, 84},
-    {13, 0, 0, 0, 5, 0, 84},
-    {6, 0, 0, 0, 5, 0, 22},
-    {7, 0, 0, 0, 5, 0, 76},
-    {12, 0, 13, 0, 5, 0, 76},
-    {10, 0, 0, 0, 5, 0, 76},
-    {13, 0, 0, 0, 5, 0, 76},
-    {21, 0, 0, 0, 5, 0, 76},
-    {7, 0, 0, 0, 5, 0, 78},
-    {12, 230, 13, 0, 5, 0, 78},
-    {12, 220, 13, 0, 5, 0, 78},
-    {6, 0, 0, 0, 5, 0, 78},
-    {21, 0, 0, 0, 5, 0, 78},
-    {7, 0, 0, 0, 5, 0, 85},
-    {10, 0, 0, 0, 5, 0, 85},
-    {12, 0, 13, 0, 5, 0, 85},
-    {21, 0, 0, 0, 5, 0, 85},
-    {6, 0, 0, 0, 5, 0, 85},
-    {12, 9, 13, 0, 5, 0, 85},
-    {13, 0, 0, 0, 5, 0, 85},
-    {4, 0, 0, 0, 5, 0, 102},
-    {3, 0, 0, 0, 4, 0, 102},
-    {12, 26, 13, 0, 5, 0, 5},
-    {25, 0, 9, 0, 5, 0, 5},
-    {24, 0, 4, 0, 5, 0, 6},
-    {18, 0, 18, 0, 5, 0, 0},
-    {16, 0, 18, 0, 2, 0, 0},
-    {21, 0, 12, 0, 2, 0, 0},
-    {21, 0, 10, 0, 2, 0, 0},
-    {25, 0, 9, 0, 2, 0, 0},
-    {17, 0, 9, 0, 2, 0, 0},
-    {25, 0, 18, 1, 2, 0, 0},
-    {25, 0, 18, 0, 2, 0, 0},
-    {23, 0, 10, 0, 2, 0, 0},
-    {21, 0, 18, 0, 0, 0, 0},
-    {21, 0, 10, 0, 0, 0, 0},
-    {23, 0, 10, 0, 0, 0, 0},
+    {21, 0, 18, 0, 5, 0, 0},
+    {17, 0, 18, 0, 5, 0, 12},
+    {17, 0, 18, 0, 5, 0, 19},
+    {26, 0, 18, 0, 2, 35, 14},
+    {29, 0, 17, 0, 0, 0, 17},
+    {21, 0, 18, 0, 2, 0, 1},
+    {21, 0, 18, 0, 2, 0, 14},
+    {6, 0, 0, 0, 2, 35, 5},
+    {7, 0, 0, 0, 2, 0, 14},
+    {14, 0, 0, 0, 2, 35, 14},
+    {17, 0, 18, 0, 2, 0, 5},
+    {22, 0, 18, 0, 2, 0, 0},
+    {18, 0, 18, 0, 2, 0, 1},
+    {12, 218, 13, 0, 2, 40, 21},
+    {12, 228, 13, 0, 2, 40, 21},
+    {12, 232, 13, 0, 2, 40, 21},
+    {12, 222, 13, 0, 2, 40, 21},
+    {10, 224, 0, 0, 2, 24, 21},
+    {17, 0, 18, 0, 2, 0, 14},
+    {6, 0, 0, 0, 2, 0, 14},
+    {6, 0, 0, 0, 2, 0, 21},
+    {7, 0, 0, 0, 2, 0, 5},
+    {7, 0, 0, 0, 2, 32, 32},
+    {7, 0, 0, 0, 2, 32, 14},
+    {12, 8, 13, 0, 2, 40, 21},
+    {24, 0, 18, 0, 2, 0, 5},
+    {6, 0, 0, 0, 2, 32, 5},
+    {7, 0, 0, 0, 2, 33, 32},
+    {7, 0, 0, 0, 2, 33, 14},
+    {21, 0, 18, 0, 2, 0, 5},
+    {6, 0, 0, 0, 2, 0, 32},
+    {6, 0, 0, 0, 2, 33, 5},
+    {7, 0, 0, 0, 2, 34, 14},
+    {7, 0, 0, 0, 2, 24, 14},
+    {26, 0, 0, 0, 2, 0, 14},
+    {15, 0, 0, 0, 2, 0, 14},
+    {26, 0, 0, 0, 2, 24, 14},
+    {26, 0, 18, 0, 2, 24, 14},
+    {15, 0, 0, 0, 4, 0, 29},
+    {15, 0, 18, 0, 2, 0, 14},
+    {26, 0, 0, 0, 2, 33, 14},
+    {7, 0, 0, 0, 2, 35, 14},
+    {2, 0, 18, 0, 2, 102, 14},
+    {7, 0, 0, 0, 2, 36, 14},
+    {6, 0, 0, 0, 2, 36, 5},
+    {26, 0, 18, 0, 2, 36, 14},
+    {7, 0, 0, 0, 5, 82, 12},
+    {6, 0, 0, 0, 5, 82, 12},
+    {21, 0, 0, 0, 5, 82, 17},
+    {7, 0, 0, 0, 5, 69, 12},
+    {6, 0, 0, 0, 5, 69, 12},
+    {21, 0, 18, 0, 5, 69, 17},
+    {21, 0, 18, 0, 5, 69, 6},
+    {13, 0, 0, 0, 5, 69, 11},
+    {7, 0, 0, 0, 5, 3, 12},
+    {21, 0, 18, 0, 5, 3, 12},
+    {6, 0, 18, 0, 5, 3, 12},
+    {7, 0, 0, 0, 5, 83, 12},
+    {14, 0, 0, 0, 5, 83, 12},
+    {12, 230, 13, 0, 5, 83, 21},
+    {21, 0, 0, 0, 5, 83, 12},
+    {21, 0, 0, 0, 5, 83, 17},
+    {24, 0, 0, 0, 5, 0, 12},
+    {7, 0, 0, 0, 5, 58, 12},
+    {12, 0, 13, 0, 5, 58, 21},
+    {12, 9, 13, 0, 5, 58, 21},
+    {10, 0, 0, 0, 5, 58, 21},
+    {26, 0, 18, 0, 5, 58, 12},
+    {15, 0, 0, 0, 5, 0, 12},
+    {7, 0, 0, 0, 5, 64, 12},
+    {21, 0, 18, 0, 5, 64, 18},
+    {21, 0, 18, 0, 5, 64, 6},
+    {10, 0, 0, 0, 5, 70, 21},
+    {7, 0, 0, 0, 5, 70, 12},
+    {12, 9, 13, 0, 5, 70, 21},
+    {12, 0, 13, 0, 5, 70, 21},
+    {21, 0, 0, 0, 5, 70, 17},
+    {13, 0, 0, 0, 5, 70, 11},
+    {21, 0, 0, 0, 5, 9, 18},
+    {13, 0, 0, 0, 5, 71, 11},
+    {7, 0, 0, 0, 5, 71, 12},
+    {12, 0, 13, 0, 5, 71, 21},
+    {12, 220, 13, 0, 5, 71, 21},
+    {21, 0, 0, 0, 5, 71, 17},
+    {7, 0, 0, 0, 5, 72, 12},
+    {12, 0, 13, 0, 5, 72, 21},
+    {10, 0, 0, 0, 5, 72, 21},
+    {10, 9, 0, 0, 5, 72, 21},
+    {21, 0, 0, 0, 5, 72, 12},
+    {12, 0, 13, 0, 5, 84, 21},
+    {10, 0, 0, 0, 5, 84, 21},
+    {7, 0, 0, 0, 5, 84, 12},
+    {12, 7, 13, 0, 5, 84, 21},
+    {10, 9, 0, 0, 5, 84, 21},
+    {21, 0, 0, 0, 5, 84, 12},
+    {21, 0, 0, 0, 5, 84, 17},
+    {13, 0, 0, 0, 5, 84, 11},
+    {6, 0, 0, 0, 5, 22, 38},
+    {7, 0, 0, 0, 5, 76, 12},
+    {12, 0, 13, 0, 5, 76, 21},
+    {10, 0, 0, 0, 5, 76, 21},
+    {13, 0, 0, 0, 5, 76, 11},
+    {21, 0, 0, 0, 5, 76, 12},
+    {21, 0, 0, 0, 5, 76, 17},
+    {7, 0, 0, 0, 5, 78, 38},
+    {12, 230, 13, 0, 5, 78, 38},
+    {12, 220, 13, 0, 5, 78, 38},
+    {6, 0, 0, 0, 5, 78, 38},
+    {21, 0, 0, 0, 5, 78, 38},
+    {7, 0, 0, 0, 5, 85, 12},
+    {10, 0, 0, 0, 5, 85, 21},
+    {12, 0, 13, 0, 5, 85, 21},
+    {21, 0, 0, 0, 5, 85, 17},
+    {6, 0, 0, 0, 5, 85, 12},
+    {12, 9, 13, 0, 5, 85, 21},
+    {13, 0, 0, 0, 5, 85, 11},
+    {7, 0, 0, 0, 2, 24, 23},
+    {7, 0, 0, 0, 2, 24, 24},
+    {4, 0, 0, 0, 5, 102, 39},
+    {3, 0, 0, 0, 4, 102, 41},
+    {12, 26, 13, 0, 5, 5, 21},
+    {25, 0, 9, 0, 5, 5, 12},
+    {24, 0, 4, 0, 5, 6, 12},
+    {18, 0, 18, 0, 5, 0, 1},
+    {12, 0, 13, 0, 4, 40, 21},
+    {21, 0, 18, 0, 2, 0, 8},
+    {21, 0, 18, 0, 2, 0, 6},
+    {21, 0, 18, 0, 2, 0, 15},
+    {16, 0, 18, 0, 2, 0, 14},
+    {21, 0, 12, 0, 2, 0, 1},
+    {21, 0, 12, 0, 2, 0, 5},
+    {21, 0, 10, 0, 2, 0, 14},
+    {25, 0, 9, 0, 2, 0, 14},
+    {17, 0, 9, 0, 2, 0, 14},
+    {25, 0, 18, 1, 2, 0, 14},
+    {25, 0, 18, 0, 2, 0, 14},
+    {23, 0, 10, 0, 2, 0, 9},
+    {21, 0, 10, 0, 2, 0, 10},
+    {21, 0, 18, 0, 0, 0, 6},
+    {21, 0, 18, 0, 0, 0, 14},
+    {21, 0, 10, 0, 0, 0, 14},
+    {23, 0, 10, 0, 0, 0, 9},
+    {21, 0, 10, 0, 0, 0, 10},
     {22, 0, 18, 1, 0, 0, 0},
-    {18, 0, 18, 1, 0, 0, 0},
-    {25, 0, 9, 0, 0, 0, 0},
-    {21, 0, 12, 0, 0, 0, 0},
-    {17, 0, 9, 0, 0, 0, 0},
-    {13, 0, 8, 0, 0, 0, 0},
-    {25, 0, 18, 1, 0, 0, 0},
-    {25, 0, 18, 0, 0, 0, 0},
-    {9, 0, 0, 0, 0, 0, 1},
-    {24, 0, 18, 0, 0, 0, 0},
-    {16, 0, 18, 0, 0, 0, 0},
-    {5, 0, 0, 0, 0, 0, 1},
-    {21, 0, 18, 0, 1, 0, 0},
+    {18, 0, 18, 1, 0, 0, 1},
+    {25, 0, 9, 0, 0, 0, 14},
+    {21, 0, 12, 0, 0, 0, 1},
+    {17, 0, 9, 0, 0, 0, 14},
+    {21, 0, 12, 0, 0, 0, 14},
+    {13, 0, 8, 0, 0, 0, 14},
+    {21, 0, 12, 0, 0, 0, 5},
+    {21, 0, 18, 0, 0, 0, 5},
+    {25, 0, 18, 1, 0, 0, 14},
+    {25, 0, 18, 0, 0, 0, 14},
+    {9, 0, 0, 0, 0, 1, 14},
+    {24, 0, 18, 0, 0, 0, 14},
+    {16, 0, 18, 0, 0, 0, 14},
+    {5, 0, 0, 0, 0, 1, 14},
+    {21, 0, 18, 0, 1, 0, 1},
     {22, 0, 18, 1, 1, 0, 0},
-    {18, 0, 18, 1, 1, 0, 0},
-    {7, 0, 0, 0, 1, 0, 33},
-    {6, 0, 0, 0, 1, 0, 0},
-    {7, 0, 0, 0, 1, 0, 24},
-    {26, 0, 18, 0, 0, 0, 0},
-    {26, 0, 18, 0, 1, 0, 0},
-    {25, 0, 18, 0, 1, 0, 0},
-    {1, 0, 18, 0, 5, 0, 0},
-    {7, 0, 0, 0, 5, 0, 47},
-    {14, 0, 18, 0, 5, 0, 2},
-    {15, 0, 18, 0, 5, 0, 2},
-    {26, 0, 18, 0, 5, 0, 2},
-    {7, 0, 0, 0, 5, 0, 73},
-    {7, 0, 0, 0, 5, 0, 74},
-    {7, 0, 0, 0, 5, 0, 37},
-    {15, 0, 0, 0, 5, 0, 37},
-    {7, 0, 0, 0, 5, 0, 38},
-    {14, 0, 0, 0, 5, 0, 38},
-    {7, 0, 0, 0, 5, 0, 118},
-    {12, 230, 13, 0, 5, 0, 118},
-    {7, 0, 0, 0, 5, 0, 48},
-    {21, 0, 0, 0, 5, 0, 48},
-    {7, 0, 0, 0, 5, 0, 59},
-    {21, 0, 0, 0, 5, 0, 59},
-    {14, 0, 0, 0, 5, 0, 59},
-    {9, 0, 0, 0, 5, 0, 39},
-    {5, 0, 0, 0, 5, 0, 39},
-    {7, 0, 0, 0, 5, 0, 49},
-    {7, 0, 0, 0, 5, 0, 50},
-    {13, 0, 0, 0, 5, 0, 50},
-    {7, 0, 0, 0, 5, 0, 106},
-    {7, 0, 0, 0, 5, 0, 104},
-    {21, 0, 0, 0, 5, 0, 104},
-    {7, 0, 0, 0, 5, 0, 110},
-    {7, 0, 3, 0, 5, 0, 51},
-    {7, 0, 3, 0, 5, 0, 86},
-    {21, 0, 3, 0, 5, 0, 86},
-    {15, 0, 3, 0, 5, 0, 86},
-    {7, 0, 3, 0, 5, 0, 120},
-    {26, 0, 3, 0, 5, 0, 120},
-    {15, 0, 3, 0, 5, 0, 120},
-    {7, 0, 3, 0, 5, 0, 116},
-    {15, 0, 3, 0, 5, 0, 116},
-    {7, 0, 3, 0, 5, 0, 128},
-    {15, 0, 3, 0, 5, 0, 128},
-    {7, 0, 3, 0, 5, 0, 63},
-    {15, 0, 3, 0, 5, 0, 63},
-    {21, 0, 18, 0, 5, 0, 63},
-    {7, 0, 3, 0, 5, 0, 75},
-    {21, 0, 3, 0, 5, 0, 75},
-    {7, 0, 3, 0, 5, 0, 97},
-    {7, 0, 3, 0, 5, 0, 96},
-    {15, 0, 3, 0, 5, 0, 96},
-    {7, 0, 3, 0, 5, 0, 60},
-    {12, 0, 13, 0, 5, 0, 60},
-    {12, 220, 13, 0, 5, 0, 60},
-    {12, 230, 13, 0, 5, 0, 60},
-    {12, 1, 13, 0, 5, 0, 60},
-    {12, 9, 13, 0, 5, 0, 60},
-    {15, 0, 3, 0, 5, 0, 60},
-    {21, 0, 3, 0, 5, 0, 60},
-    {7, 0, 3, 0, 5, 0, 87},
-    {15, 0, 3, 0, 5, 0, 87},
-    {21, 0, 3, 0, 5, 0, 87},
-    {7, 0, 3, 0, 5, 0, 117},
-    {15, 0, 3, 0, 5, 0, 117},
-    {7, 0, 3, 0, 5, 0, 112},
-    {26, 0, 3, 0, 5, 0, 112},
-    {12, 230, 13, 0, 5, 0, 112},
-    {12, 220, 13, 0, 5, 0, 112},
-    {15, 0, 3, 0, 5, 0, 112},
-    {21, 0, 3, 0, 5, 0, 112},
-    {7, 0, 3, 0, 5, 0, 79},
-    {21, 0, 18, 0, 5, 0, 79},
-    {7, 0, 3, 0, 5, 0, 88},
-    {15, 0, 3, 0, 5, 0, 88},
-    {7, 0, 3, 0, 5, 0, 89},
-    {15, 0, 3, 0, 5, 0, 89},
-    {7, 0, 3, 0, 5, 0, 122},
-    {21, 0, 3, 0, 5, 0, 122},
-    {15, 0, 3, 0, 5, 0, 122},
-    {7, 0, 3, 0, 5, 0, 90},
-    {9, 0, 3, 0, 5, 0, 130},
-    {5, 0, 3, 0, 5, 0, 130},
-    {15, 0, 3, 0, 5, 0, 130},
-    {15, 0, 11, 0, 5, 0, 6},
-    {10, 0, 0, 0, 5, 0, 93},
-    {12, 0, 13, 0, 5, 0, 93},
-    {7, 0, 0, 0, 5, 0, 93},
-    {12, 9, 13, 0, 5, 0, 93},
-    {21, 0, 0, 0, 5, 0, 93},
-    {15, 0, 18, 0, 5, 0, 93},
-    {13, 0, 0, 0, 5, 0, 93},
-    {12, 0, 13, 0, 5, 0, 91},
-    {10, 0, 0, 0, 5, 0, 91},
-    {7, 0, 0, 0, 5, 0, 91},
-    {12, 9, 13, 0, 5, 0, 91},
-    {12, 7, 13, 0, 5, 0, 91},
-    {21, 0, 0, 0, 5, 0, 91},
-    {1, 0, 0, 0, 5, 0, 91},
-    {7, 0, 0, 0, 5, 0, 100},
-    {13, 0, 0, 0, 5, 0, 100},
-    {12, 230, 13, 0, 5, 0, 95},
-    {7, 0, 0, 0, 5, 0, 95},
-    {12, 0, 13, 0, 5, 0, 95},
-    {10, 0, 0, 0, 5, 0, 95},
-    {12, 9, 13, 0, 5, 0, 95},
-    {13, 0, 0, 0, 5, 0, 95},
-    {21, 0, 0, 0, 5, 0, 95},
-    {7, 0, 0, 0, 5, 0, 111},
-    {12, 7, 13, 0, 5, 0, 111},
-    {21, 0, 0, 0, 5, 0, 111},
-    {12, 0, 13, 0, 5, 0, 99},
-    {10, 0, 0, 0, 5, 0, 99},
-    {7, 0, 0, 0, 5, 0, 99},
-    {10, 9, 0, 0, 5, 0, 99},
-    {21, 0, 0, 0, 5, 0, 99},
-    {12, 7, 13, 0, 5, 0, 99},
-    {13, 0, 0, 0, 5, 0, 99},
-    {15, 0, 0, 0, 5, 0, 18},
-    {7, 0, 0, 0, 5, 0, 108},
-    {10, 0, 0, 0, 5, 0, 108},
-    {12, 0, 13, 0, 5, 0, 108},
-    {10, 9, 0, 0, 5, 0, 108},
-    {12, 7, 13, 0, 5, 0, 108},
-    {21, 0, 0, 0, 5, 0, 108},
-    {7, 0, 0, 0, 5, 0, 129},
-    {21, 0, 0, 0, 5, 0, 129},
-    {7, 0, 0, 0, 5, 0, 109},
-    {12, 0, 13, 0, 5, 0, 109},
-    {10, 0, 0, 0, 5, 0, 109},
-    {12, 7, 13, 0, 5, 0, 109},
-    {12, 9, 13, 0, 5, 0, 109},
-    {13, 0, 0, 0, 5, 0, 109},
-    {12, 0, 13, 0, 5, 0, 107},
-    {10, 0, 0, 0, 5, 0, 107},
-    {7, 0, 0, 0, 5, 0, 107},
-    {12, 7, 13, 0, 5, 0, 107},
-    {10, 9, 0, 0, 5, 0, 107},
-    {12, 230, 13, 0, 5, 0, 107},
-    {7, 0, 0, 0, 5, 0, 124},
-    {10, 0, 0, 0, 5, 0, 124},
-    {12, 0, 13, 0, 5, 0, 124},
-    {12, 9, 13, 0, 5, 0, 124},
-    {12, 7, 13, 0, 5, 0, 124},
-    {21, 0, 0, 0, 5, 0, 124},
-    {13, 0, 0, 0, 5, 0, 124},
-    {7, 0, 0, 0, 5, 0, 123},
-    {10, 0, 0, 0, 5, 0, 123},
-    {12, 0, 13, 0, 5, 0, 123},
-    {12, 9, 13, 0, 5, 0, 123},
-    {12, 7, 13, 0, 5, 0, 123},
-    {21, 0, 0, 0, 5, 0, 123},
-    {7, 0, 0, 0, 5, 0, 114},
-    {10, 0, 0, 0, 5, 0, 114},
-    {12, 0, 13, 0, 5, 0, 114},
-    {12, 9, 13, 0, 5, 0, 114},
-    {21, 0, 0, 0, 5, 0, 114},
-    {13, 0, 0, 0, 5, 0, 114},
-    {7, 0, 0, 0, 5, 0, 101},
-    {12, 0, 13, 0, 5, 0, 101},
-    {10, 0, 0, 0, 5, 0, 101},
-    {10, 9, 0, 0, 5, 0, 101},
-    {12, 7, 13, 0, 5, 0, 101},
-    {13, 0, 0, 0, 5, 0, 101},
-    {7, 0, 0, 0, 5, 0, 126},
-    {12, 0, 13, 0, 5, 0, 126},
-    {10, 0, 0, 0, 5, 0, 126},
-    {12, 9, 13, 0, 5, 0, 126},
-    {13, 0, 0, 0, 5, 0, 126},
-    {15, 0, 0, 0, 5, 0, 126},
-    {21, 0, 0, 0, 5, 0, 126},
-    {26, 0, 0, 0, 5, 0, 126},
-    {9, 0, 0, 0, 5, 0, 125},
-    {5, 0, 0, 0, 5, 0, 125},
-    {13, 0, 0, 0, 5, 0, 125},
-    {15, 0, 0, 0, 5, 0, 125},
-    {7, 0, 0, 0, 5, 0, 125},
-    {7, 0, 0, 0, 5, 0, 121},
-    {7, 0, 0, 0, 5, 0, 62},
-    {14, 0, 0, 0, 5, 0, 62},
-    {21, 0, 0, 0, 5, 0, 62},
-    {7, 0, 0, 0, 5, 0, 80},
-    {7, 0, 0, 0, 5, 0, 127},
-    {7, 0, 0, 0, 5, 0, 115},
-    {13, 0, 0, 0, 5, 0, 115},
-    {21, 0, 0, 0, 5, 0, 115},
-    {7, 0, 0, 0, 5, 0, 103},
-    {12, 1, 13, 0, 5, 0, 103},
-    {21, 0, 0, 0, 5, 0, 103},
-    {7, 0, 0, 0, 5, 0, 119},
-    {12, 230, 13, 0, 5, 0, 119},
-    {21, 0, 0, 0, 5, 0, 119},
-    {26, 0, 0, 0, 5, 0, 119},
-    {6, 0, 0, 0, 5, 0, 119},
-    {13, 0, 0, 0, 5, 0, 119},
-    {15, 0, 0, 0, 5, 0, 119},
-    {7, 0, 0, 0, 5, 0, 98},
-    {10, 0, 0, 0, 5, 0, 98},
-    {12, 0, 13, 0, 5, 0, 98},
-    {6, 0, 0, 0, 5, 0, 98},
-    {7, 0, 0, 0, 5, 0, 105},
-    {26, 0, 0, 0, 5, 0, 105},
-    {12, 0, 13, 0, 5, 0, 105},
-    {12, 1, 13, 0, 5, 0, 105},
-    {21, 0, 0, 0, 5, 0, 105},
-    {10, 216, 0, 0, 5, 0, 0},
-    {10, 226, 0, 0, 5, 0, 0},
-    {12, 230, 13, 0, 5, 0, 2},
-    {25, 0, 0, 0, 5, 0, 0},
-    {13, 0, 8, 0, 5, 0, 0},
-    {26, 0, 0, 0, 5, 0, 131},
-    {12, 0, 13, 0, 5, 0, 131},
-    {21, 0, 0, 0, 5, 0, 131},
-    {7, 0, 3, 0, 5, 0, 113},
-    {15, 0, 3, 0, 5, 0, 113},
-    {12, 220, 13, 0, 5, 0, 113},
-    {26, 0, 0, 0, 2, 0, 32},
+    {18, 0, 18, 1, 1, 0, 1},
+    {21, 0, 18, 0, 1, 0, 5},
+    {7, 0, 0, 0, 1, 33, 14},
+    {7, 0, 0, 0, 1, 33, 32},
+    {6, 0, 0, 0, 1, 0, 32},
+    {6, 0, 0, 0, 1, 0, 5},
+    {7, 0, 0, 0, 1, 24, 14},
+    {23, 0, 10, 0, 0, 0, 10},
+    {26, 0, 18, 0, 0, 0, 14},
+    {26, 0, 18, 0, 1, 0, 12},
+    {25, 0, 18, 0, 1, 0, 12},
+    {1, 0, 18, 0, 5, 0, 21},
+    {26, 0, 18, 0, 5, 0, 31},
+    {7, 0, 0, 0, 5, 47, 12},
+    {14, 0, 18, 0, 5, 2, 12},
+    {15, 0, 18, 0, 5, 2, 12},
+    {26, 0, 18, 0, 5, 2, 12},
+    {26, 0, 0, 0, 5, 2, 12},
+    {7, 0, 0, 0, 5, 73, 12},
+    {7, 0, 0, 0, 5, 74, 12},
+    {7, 0, 0, 0, 5, 37, 12},
+    {15, 0, 0, 0, 5, 37, 12},
+    {7, 0, 0, 0, 5, 38, 12},
+    {14, 0, 0, 0, 5, 38, 12},
+    {7, 0, 0, 0, 5, 118, 12},
+    {12, 230, 13, 0, 5, 118, 21},
+    {7, 0, 0, 0, 5, 48, 12},
+    {21, 0, 0, 0, 5, 48, 17},
+    {7, 0, 0, 0, 5, 59, 12},
+    {21, 0, 0, 0, 5, 59, 17},
+    {14, 0, 0, 0, 5, 59, 12},
+    {9, 0, 0, 0, 5, 39, 12},
+    {5, 0, 0, 0, 5, 39, 12},
+    {7, 0, 0, 0, 5, 49, 12},
+    {7, 0, 0, 0, 5, 50, 12},
+    {13, 0, 0, 0, 5, 50, 11},
+    {9, 0, 0, 0, 5, 136, 12},
+    {5, 0, 0, 0, 5, 136, 12},
+    {7, 0, 0, 0, 5, 106, 12},
+    {7, 0, 0, 0, 5, 104, 12},
+    {21, 0, 0, 0, 5, 104, 12},
+    {7, 0, 0, 0, 5, 110, 12},
+    {7, 0, 3, 0, 5, 51, 12},
+    {7, 0, 3, 0, 5, 86, 12},
+    {21, 0, 3, 0, 5, 86, 17},
+    {15, 0, 3, 0, 5, 86, 12},
+    {7, 0, 3, 0, 5, 120, 12},
+    {26, 0, 3, 0, 5, 120, 12},
+    {15, 0, 3, 0, 5, 120, 12},
+    {7, 0, 3, 0, 5, 116, 12},
+    {15, 0, 3, 0, 5, 116, 12},
+    {7, 0, 3, 0, 5, 128, 12},
+    {15, 0, 3, 0, 5, 128, 12},
+    {7, 0, 3, 0, 5, 63, 12},
+    {15, 0, 3, 0, 5, 63, 12},
+    {21, 0, 18, 0, 5, 63, 17},
+    {7, 0, 3, 0, 5, 75, 12},
+    {21, 0, 3, 0, 5, 75, 12},
+    {7, 0, 3, 0, 5, 97, 12},
+    {7, 0, 3, 0, 5, 96, 12},
+    {15, 0, 3, 0, 5, 96, 12},
+    {7, 0, 3, 0, 5, 60, 12},
+    {12, 0, 13, 0, 5, 60, 21},
+    {12, 220, 13, 0, 5, 60, 21},
+    {12, 230, 13, 0, 5, 60, 21},
+    {12, 1, 13, 0, 5, 60, 21},
+    {12, 9, 13, 0, 5, 60, 21},
+    {15, 0, 3, 0, 5, 60, 12},
+    {21, 0, 3, 0, 5, 60, 17},
+    {21, 0, 3, 0, 5, 60, 12},
+    {7, 0, 3, 0, 5, 87, 12},
+    {15, 0, 3, 0, 5, 87, 12},
+    {21, 0, 3, 0, 5, 87, 12},
+    {7, 0, 3, 0, 5, 117, 12},
+    {15, 0, 3, 0, 5, 117, 12},
+    {7, 0, 3, 0, 5, 112, 12},
+    {26, 0, 3, 0, 5, 112, 12},
+    {12, 230, 13, 0, 5, 112, 21},
+    {12, 220, 13, 0, 5, 112, 21},
+    {15, 0, 3, 0, 5, 112, 12},
+    {21, 0, 3, 0, 5, 112, 17},
+    {21, 0, 3, 0, 5, 112, 15},
+    {7, 0, 3, 0, 5, 79, 12},
+    {21, 0, 18, 0, 5, 79, 17},
+    {7, 0, 3, 0, 5, 88, 12},
+    {15, 0, 3, 0, 5, 88, 12},
+    {7, 0, 3, 0, 5, 89, 12},
+    {15, 0, 3, 0, 5, 89, 12},
+    {7, 0, 3, 0, 5, 122, 12},
+    {21, 0, 3, 0, 5, 122, 12},
+    {15, 0, 3, 0, 5, 122, 12},
+    {7, 0, 3, 0, 5, 90, 12},
+    {9, 0, 3, 0, 5, 130, 12},
+    {5, 0, 3, 0, 5, 130, 12},
+    {15, 0, 3, 0, 5, 130, 12},
+    {15, 0, 11, 0, 5, 6, 12},
+    {10, 0, 0, 0, 5, 93, 21},
+    {12, 0, 13, 0, 5, 93, 21},
+    {7, 0, 0, 0, 5, 93, 12},
+    {12, 9, 13, 0, 5, 93, 21},
+    {21, 0, 0, 0, 5, 93, 17},
+    {21, 0, 0, 0, 5, 93, 12},
+    {15, 0, 18, 0, 5, 93, 12},
+    {13, 0, 0, 0, 5, 93, 11},
+    {12, 0, 13, 0, 5, 91, 21},
+    {10, 0, 0, 0, 5, 91, 21},
+    {7, 0, 0, 0, 5, 91, 12},
+    {12, 9, 13, 0, 5, 91, 21},
+    {12, 7, 13, 0, 5, 91, 21},
+    {21, 0, 0, 0, 5, 91, 12},
+    {1, 0, 0, 0, 5, 91, 12},
+    {21, 0, 0, 0, 5, 91, 17},
+    {7, 0, 0, 0, 5, 100, 12},
+    {13, 0, 0, 0, 5, 100, 11},
+    {12, 230, 13, 0, 5, 95, 21},
+    {7, 0, 0, 0, 5, 95, 12},
+    {12, 0, 13, 0, 5, 95, 21},
+    {10, 0, 0, 0, 5, 95, 21},
+    {12, 9, 13, 0, 5, 95, 21},
+    {13, 0, 0, 0, 5, 95, 11},
+    {21, 0, 0, 0, 5, 95, 17},
+    {7, 0, 0, 0, 5, 111, 12},
+    {12, 7, 13, 0, 5, 111, 21},
+    {21, 0, 0, 0, 5, 111, 12},
+    {21, 0, 0, 0, 5, 111, 18},
+    {12, 0, 13, 0, 5, 99, 21},
+    {10, 0, 0, 0, 5, 99, 21},
+    {7, 0, 0, 0, 5, 99, 12},
+    {10, 9, 0, 0, 5, 99, 21},
+    {21, 0, 0, 0, 5, 99, 17},
+    {21, 0, 0, 0, 5, 99, 12},
+    {12, 7, 13, 0, 5, 99, 21},
+    {13, 0, 0, 0, 5, 99, 11},
+    {21, 0, 0, 0, 5, 99, 18},
+    {15, 0, 0, 0, 5, 18, 12},
+    {7, 0, 0, 0, 5, 108, 12},
+    {10, 0, 0, 0, 5, 108, 21},
+    {12, 0, 13, 0, 5, 108, 21},
+    {10, 9, 0, 0, 5, 108, 21},
+    {12, 7, 13, 0, 5, 108, 21},
+    {21, 0, 0, 0, 5, 108, 17},
+    {21, 0, 0, 0, 5, 108, 12},
+    {7, 0, 0, 0, 5, 129, 12},
+    {21, 0, 0, 0, 5, 129, 17},
+    {7, 0, 0, 0, 5, 109, 12},
+    {12, 0, 13, 0, 5, 109, 21},
+    {10, 0, 0, 0, 5, 109, 21},
+    {12, 7, 13, 0, 5, 109, 21},
+    {12, 9, 13, 0, 5, 109, 21},
+    {13, 0, 0, 0, 5, 109, 11},
+    {12, 0, 13, 0, 5, 107, 21},
+    {10, 0, 0, 0, 5, 107, 21},
+    {7, 0, 0, 0, 5, 107, 12},
+    {12, 7, 13, 0, 5, 107, 21},
+    {10, 9, 0, 0, 5, 107, 21},
+    {12, 230, 13, 0, 5, 107, 21},
+    {7, 0, 0, 0, 5, 135, 12},
+    {10, 0, 0, 0, 5, 135, 21},
+    {12, 0, 13, 0, 5, 135, 21},
+    {12, 9, 13, 0, 5, 135, 21},
+    {12, 7, 13, 0, 5, 135, 21},
+    {21, 0, 0, 0, 5, 135, 17},
+    {21, 0, 0, 0, 5, 135, 12},
+    {13, 0, 0, 0, 5, 135, 11},
+    {7, 0, 0, 0, 5, 124, 12},
+    {10, 0, 0, 0, 5, 124, 21},
+    {12, 0, 13, 0, 5, 124, 21},
+    {12, 9, 13, 0, 5, 124, 21},
+    {12, 7, 13, 0, 5, 124, 21},
+    {21, 0, 0, 0, 5, 124, 12},
+    {13, 0, 0, 0, 5, 124, 11},
+    {7, 0, 0, 0, 5, 123, 12},
+    {10, 0, 0, 0, 5, 123, 21},
+    {12, 0, 13, 0, 5, 123, 21},
+    {12, 9, 13, 0, 5, 123, 21},
+    {12, 7, 13, 0, 5, 123, 21},
+    {21, 0, 0, 0, 5, 123, 18},
+    {21, 0, 0, 0, 5, 123, 17},
+    {21, 0, 0, 0, 5, 123, 6},
+    {21, 0, 0, 0, 5, 123, 12},
+    {7, 0, 0, 0, 5, 114, 12},
+    {10, 0, 0, 0, 5, 114, 21},
+    {12, 0, 13, 0, 5, 114, 21},
+    {12, 9, 13, 0, 5, 114, 21},
+    {21, 0, 0, 0, 5, 114, 17},
+    {21, 0, 0, 0, 5, 114, 12},
+    {13, 0, 0, 0, 5, 114, 11},
+    {21, 0, 18, 0, 5, 31, 18},
+    {7, 0, 0, 0, 5, 101, 12},
+    {12, 0, 13, 0, 5, 101, 21},
+    {10, 0, 0, 0, 5, 101, 21},
+    {10, 9, 0, 0, 5, 101, 21},
+    {12, 7, 13, 0, 5, 101, 21},
+    {13, 0, 0, 0, 5, 101, 11},
+    {7, 0, 0, 0, 5, 126, 38},
+    {12, 0, 13, 0, 5, 126, 38},
+    {10, 0, 0, 0, 5, 126, 38},
+    {12, 9, 13, 0, 5, 126, 38},
+    {13, 0, 0, 0, 5, 126, 11},
+    {15, 0, 0, 0, 5, 126, 38},
+    {21, 0, 0, 0, 5, 126, 17},
+    {26, 0, 0, 0, 5, 126, 38},
+    {9, 0, 0, 0, 5, 125, 12},
+    {5, 0, 0, 0, 5, 125, 12},
+    {13, 0, 0, 0, 5, 125, 11},
+    {15, 0, 0, 0, 5, 125, 12},
+    {7, 0, 0, 0, 5, 125, 12},
+    {7, 0, 0, 0, 5, 121, 12},
+    {7, 0, 0, 0, 5, 133, 12},
+    {10, 0, 0, 0, 5, 133, 21},
+    {12, 0, 13, 0, 5, 133, 21},
+    {12, 9, 0, 0, 5, 133, 21},
+    {21, 0, 0, 0, 5, 133, 17},
+    {13, 0, 0, 0, 5, 133, 11},
+    {15, 0, 0, 0, 5, 133, 12},
+    {21, 0, 0, 0, 5, 134, 18},
+    {21, 0, 0, 0, 5, 134, 6},
+    {7, 0, 0, 0, 5, 134, 12},
+    {12, 0, 13, 0, 5, 134, 21},
+    {10, 0, 0, 0, 5, 134, 21},
+    {7, 0, 0, 0, 5, 62, 12},
+    {14, 0, 0, 0, 5, 62, 12},
+    {21, 0, 0, 0, 5, 62, 17},
+    {7, 0, 0, 0, 5, 80, 12},
+    {7, 0, 0, 0, 5, 80, 0},
+    {7, 0, 0, 0, 5, 80, 1},
+    {7, 0, 0, 0, 5, 127, 12},
+    {7, 0, 0, 0, 5, 127, 0},
+    {7, 0, 0, 0, 5, 127, 1},
+    {7, 0, 0, 0, 5, 115, 12},
+    {13, 0, 0, 0, 5, 115, 11},
+    {21, 0, 0, 0, 5, 115, 17},
+    {7, 0, 0, 0, 5, 103, 12},
+    {12, 1, 13, 0, 5, 103, 21},
+    {21, 0, 0, 0, 5, 103, 17},
+    {7, 0, 0, 0, 5, 119, 12},
+    {12, 230, 13, 0, 5, 119, 21},
+    {21, 0, 0, 0, 5, 119, 17},
+    {21, 0, 0, 0, 5, 119, 12},
+    {26, 0, 0, 0, 5, 119, 12},
+    {6, 0, 0, 0, 5, 119, 12},
+    {13, 0, 0, 0, 5, 119, 11},
+    {15, 0, 0, 0, 5, 119, 12},
+    {7, 0, 0, 0, 5, 98, 12},
+    {10, 0, 0, 0, 5, 98, 21},
+    {12, 0, 13, 0, 5, 98, 21},
+    {6, 0, 0, 0, 5, 98, 12},
+    {6, 0, 0, 0, 2, 137, 5},
+    {7, 0, 0, 0, 2, 137, 14},
+    {7, 0, 0, 0, 5, 105, 12},
+    {26, 0, 0, 0, 5, 105, 12},
+    {12, 0, 13, 0, 5, 105, 21},
+    {12, 1, 13, 0, 5, 105, 21},
+    {21, 0, 0, 0, 5, 105, 17},
+    {10, 216, 0, 0, 5, 0, 21},
+    {10, 226, 0, 0, 5, 0, 21},
+    {12, 230, 13, 0, 5, 2, 21},
+    {25, 0, 0, 0, 5, 0, 12},
+    {13, 0, 8, 0, 5, 0, 11},
+    {26, 0, 0, 0, 5, 131, 12},
+    {12, 0, 13, 0, 5, 131, 21},
+    {21, 0, 0, 0, 5, 131, 17},
+    {21, 0, 0, 0, 5, 131, 12},
+    {12, 230, 13, 0, 5, 56, 21},
+    {7, 0, 3, 0, 5, 113, 12},
+    {15, 0, 3, 0, 5, 113, 12},
+    {12, 220, 13, 0, 5, 113, 21},
+    {9, 0, 3, 0, 5, 132, 12},
+    {5, 0, 3, 0, 5, 132, 12},
+    {12, 230, 13, 0, 5, 132, 21},
+    {12, 7, 13, 0, 5, 132, 21},
+    {13, 0, 3, 0, 5, 132, 11},
+    {21, 0, 3, 0, 5, 132, 0},
+    {2, 0, 18, 0, 5, 102, 14},
+    {26, 0, 0, 0, 2, 0, 29},
+    {26, 0, 0, 0, 5, 0, 28},
+    {26, 0, 0, 0, 2, 32, 14},
+    {24, 0, 18, 0, 2, 0, 41},
+    {26, 0, 18, 0, 5, 0, 5},
 };
 
 #define BIDI_MIRROR_LEN 364
@@ -1186,6 +1364,130 @@ static const MirrorPair mirror_pairs[] = {
     {65379, 65378},
 };
 
+#define BIDI_BRACKET_LEN 120
+static const BracketPair bracket_pairs[] = {
+    {40, 41, 0},
+    {41, 40, 1},
+    {91, 93, 0},
+    {93, 91, 1},
+    {123, 125, 0},
+    {125, 123, 1},
+    {3898, 3899, 0},
+    {3899, 3898, 1},
+    {3900, 3901, 0},
+    {3901, 3900, 1},
+    {5787, 5788, 0},
+    {5788, 5787, 1},
+    {8261, 8262, 0},
+    {8262, 8261, 1},
+    {8317, 8318, 0},
+    {8318, 8317, 1},
+    {8333, 8334, 0},
+    {8334, 8333, 1},
+    {8968, 8969, 0},
+    {8969, 8968, 1},
+    {8970, 8971, 0},
+    {8971, 8970, 1},
+    {9001, 9002, 0},
+    {9002, 9001, 1},
+    {10088, 10089, 0},
+    {10089, 10088, 1},
+    {10090, 10091, 0},
+    {10091, 10090, 1},
+    {10092, 10093, 0},
+    {10093, 10092, 1},
+    {10094, 10095, 0},
+    {10095, 10094, 1},
+    {10096, 10097, 0},
+    {10097, 10096, 1},
+    {10098, 10099, 0},
+    {10099, 10098, 1},
+    {10100, 10101, 0},
+    {10101, 10100, 1},
+    {10181, 10182, 0},
+    {10182, 10181, 1},
+    {10214, 10215, 0},
+    {10215, 10214, 1},
+    {10216, 10217, 0},
+    {10217, 10216, 1},
+    {10218, 10219, 0},
+    {10219, 10218, 1},
+    {10220, 10221, 0},
+    {10221, 10220, 1},
+    {10222, 10223, 0},
+    {10223, 10222, 1},
+    {10627, 10628, 0},
+    {10628, 10627, 1},
+    {10629, 10630, 0},
+    {10630, 10629, 1},
+    {10631, 10632, 0},
+    {10632, 10631, 1},
+    {10633, 10634, 0},
+    {10634, 10633, 1},
+    {10635, 10636, 0},
+    {10636, 10635, 1},
+    {10637, 10640, 0},
+    {10638, 10639, 1},
+    {10639, 10638, 0},
+    {10640, 10637, 1},
+    {10641, 10642, 0},
+    {10642, 10641, 1},
+    {10643, 10644, 0},
+    {10644, 10643, 1},
+    {10645, 10646, 0},
+    {10646, 10645, 1},
+    {10647, 10648, 0},
+    {10648, 10647, 1},
+    {10712, 10713, 0},
+    {10713, 10712, 1},
+    {10714, 10715, 0},
+    {10715, 10714, 1},
+    {10748, 10749, 0},
+    {10749, 10748, 1},
+    {11810, 11811, 0},
+    {11811, 11810, 1},
+    {11812, 11813, 0},
+    {11813, 11812, 1},
+    {11814, 11815, 0},
+    {11815, 11814, 1},
+    {11816, 11817, 0},
+    {11817, 11816, 1},
+    {12296, 12297, 0},
+    {12297, 12296, 1},
+    {12298, 12299, 0},
+    {12299, 12298, 1},
+    {12300, 12301, 0},
+    {12301, 12300, 1},
+    {12302, 12303, 0},
+    {12303, 12302, 1},
+    {12304, 12305, 0},
+    {12305, 12304, 1},
+    {12308, 12309, 0},
+    {12309, 12308, 1},
+    {12310, 12311, 0},
+    {12311, 12310, 1},
+    {12312, 12313, 0},
+    {12313, 12312, 1},
+    {12314, 12315, 0},
+    {12315, 12314, 1},
+    {65113, 65114, 0},
+    {65114, 65113, 1},
+    {65115, 65116, 0},
+    {65116, 65115, 1},
+    {65117, 65118, 0},
+    {65118, 65117, 1},
+    {65288, 65289, 0},
+    {65289, 65288, 1},
+    {65339, 65341, 0},
+    {65341, 65339, 1},
+    {65371, 65373, 0},
+    {65373, 65371, 1},
+    {65375, 65376, 0},
+    {65376, 65375, 1},
+    {65378, 65379, 0},
+    {65379, 65378, 1},
+};
+
 /* Reindexing of NFC first characters. */
 #define TOTAL_FIRST 376
 #define TOTAL_LAST 62
@@ -1585,6 +1887,12 @@ static const Reindex nfc_last[] = {
 #define UCDN_SCRIPT_MULTANI 129
 #define UCDN_SCRIPT_OLD_HUNGARIAN 130
 #define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
@@ -1654,26 +1962,27 @@ static const unsigned char index0[] = {
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57,
-    58, 59, 60, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-    65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-    65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67,
-    67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 52, 69, 70, 71, 72, 73,
-    74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 88, 90,
-    91, 92, 93, 94, 95, 96, 97, 98, 88, 99, 88, 88, 88, 88, 88, 100, 100,
-    100, 101, 102, 103, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 104, 104,
-    104, 104, 105, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 106, 106, 107, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 108, 108, 109, 110, 88, 88, 88, 111, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 112, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 113, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 114,
-    115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 124, 88, 88, 88, 88, 88, 125, 88, 126, 127,
-    128, 129, 130, 131, 132, 133, 134, 135, 88, 88, 88, 88, 88, 88, 52, 52,
+    58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68,
+    69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65,
+    66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73,
+    73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79,
+    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96,
+    97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 94, 94, 94, 107,
+    107, 107, 108, 109, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 111,
+    111, 112, 113, 114, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 115, 116, 117, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 118, 118, 119, 120, 94, 94, 94, 121, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+    122, 122, 122, 122, 123, 122, 122, 124, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 125, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 126, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 127, 128, 129, 130, 131, 132, 133, 134, 135,
+    135, 136, 94, 94, 94, 94, 94, 137, 94, 94, 94, 94, 94, 94, 94, 138, 139,
+    94, 94, 94, 94, 140, 94, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+    150, 151, 151, 151, 151, 151, 152, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
@@ -1682,216 +1991,216 @@ static const unsigned char index0[] = {
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
     52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-    52, 52, 136, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-    52, 137, 138, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-    52, 52, 52, 52, 52, 52, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 52, 52, 141, 140, 140, 140, 140, 142, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    142, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 143, 144, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
-    88, 88, 88, 88, 88, 88, 88, 88, 88, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145,
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 153, 52, 52, 52, 52,
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 154, 155, 52, 52, 52, 52,
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 52, 52,
+    158, 157, 157, 157, 157, 159, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+    157, 157, 157, 157, 157, 157, 157, 157, 157, 159, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 160, 161,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    94, 94, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 162, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 162,
 };
 
 static const unsigned short index1[] = {
@@ -1912,992 +2221,1135 @@ static const unsigned short index1[] = {
     146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150,
     151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160,
     161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 120, 120, 120, 120,
-    120, 120, 120, 120, 128, 128, 169, 120, 120, 120, 120, 120, 170, 171,
-    172, 173, 174, 175, 175, 175, 175, 175, 175, 176, 177, 178, 179, 175,
-    180, 181, 182, 175, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191,
-    192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204,
-    205, 206, 207, 208, 209, 210, 211, 120, 212, 213, 214, 215, 215, 216,
-    217, 218, 219, 220, 221, 120, 222, 223, 224, 225, 226, 227, 228, 229,
-    229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 120, 240, 241,
-    242, 243, 244, 241, 245, 246, 247, 248, 249, 120, 250, 251, 252, 253,
-    254, 255, 256, 257, 257, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-    120, 265, 266, 267, 268, 269, 269, 268, 270, 271, 272, 273, 274, 275,
-    276, 277, 278, 120, 279, 280, 281, 282, 282, 282, 282, 283, 284, 285,
-    286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 293, 293, 296, 297,
-    294, 298, 299, 300, 301, 302, 303, 120, 304, 305, 305, 305, 305, 305,
-    306, 307, 308, 309, 310, 311, 120, 120, 120, 120, 312, 313, 314, 315,
-    316, 317, 318, 319, 320, 321, 322, 323, 120, 120, 120, 120, 324, 325,
-    326, 327, 328, 329, 330, 331, 332, 333, 332, 332, 332, 334, 335, 336,
-    337, 338, 339, 340, 339, 339, 339, 341, 342, 343, 344, 345, 120, 120,
-    120, 120, 346, 346, 346, 346, 346, 347, 348, 349, 350, 351, 352, 353,
-    354, 355, 356, 346, 357, 358, 350, 359, 360, 360, 360, 360, 361, 362,
-    363, 363, 363, 363, 363, 364, 365, 365, 365, 365, 365, 365, 365, 365,
-    365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
-    366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 367, 367, 367,
-    367, 367, 367, 367, 367, 368, 369, 368, 367, 367, 367, 367, 367, 368,
-    367, 367, 367, 367, 368, 369, 368, 367, 369, 367, 367, 367, 367, 367,
-    367, 367, 368, 367, 367, 367, 367, 367, 367, 367, 367, 370, 371, 372,
-    373, 374, 367, 367, 375, 376, 377, 377, 377, 377, 377, 377, 377, 377,
-    377, 377, 378, 379, 380, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-    381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-    381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-    381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-    381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
-    381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 382, 381, 381,
-    383, 384, 384, 385, 386, 386, 386, 386, 386, 386, 386, 386, 386, 387,
-    388, 389, 390, 391, 392, 120, 393, 393, 394, 120, 395, 395, 396, 120,
-    397, 398, 399, 120, 400, 400, 400, 400, 400, 400, 401, 402, 403, 404,
-    405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 415, 415, 415,
-    416, 415, 415, 415, 415, 415, 415, 120, 415, 415, 415, 415, 415, 417,
-    381, 381, 381, 381, 381, 381, 381, 381, 418, 120, 419, 419, 419, 420,
-    421, 422, 423, 424, 425, 426, 427, 427, 427, 428, 429, 120, 430, 430,
-    430, 430, 430, 431, 430, 430, 430, 432, 433, 434, 435, 435, 435, 435,
-    436, 436, 437, 438, 439, 439, 439, 439, 439, 439, 440, 441, 442, 443,
-    444, 445, 446, 447, 446, 447, 448, 449, 450, 451, 120, 120, 120, 120,
-    120, 120, 120, 120, 452, 453, 453, 453, 453, 453, 454, 455, 456, 457,
-    458, 459, 460, 461, 462, 463, 464, 465, 465, 465, 466, 467, 468, 469,
-    470, 470, 470, 470, 471, 472, 473, 474, 475, 475, 475, 475, 476, 477,
-    478, 479, 480, 481, 482, 483, 484, 484, 484, 485, 120, 120, 120, 120,
-    120, 120, 120, 120, 486, 120, 487, 488, 489, 490, 491, 492, 54, 54, 54,
-    54, 493, 494, 56, 56, 56, 56, 56, 495, 496, 497, 54, 498, 54, 54, 54,
-    499, 56, 56, 56, 500, 501, 502, 503, 504, 504, 504, 505, 506, 27, 27, 27,
-    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 507, 508, 27,
-    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 509, 510, 511, 512, 509, 510,
-    509, 510, 511, 512, 509, 513, 509, 510, 509, 511, 509, 514, 509, 514,
-    509, 514, 515, 516, 517, 518, 519, 520, 509, 521, 522, 523, 524, 525,
-    526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
-    540, 541, 56, 542, 543, 544, 543, 545, 120, 120, 546, 547, 548, 549, 550,
-    120, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
-    564, 563, 565, 566, 567, 568, 569, 570, 571, 572, 573, 572, 574, 575,
-    572, 576, 572, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587,
-    588, 589, 590, 591, 592, 587, 587, 593, 594, 595, 596, 597, 587, 587,
-    598, 578, 599, 600, 587, 587, 601, 587, 587, 572, 602, 603, 572, 604,
-    605, 606, 607, 607, 607, 607, 607, 607, 607, 607, 608, 572, 572, 609,
-    610, 578, 578, 611, 572, 572, 572, 572, 577, 612, 572, 572, 613, 572,
-    572, 572, 572, 614, 120, 120, 120, 572, 613, 120, 120, 615, 615, 615,
-    615, 615, 616, 616, 617, 618, 618, 618, 618, 618, 618, 618, 618, 618,
-    619, 615, 615, 620, 620, 620, 620, 620, 620, 620, 620, 620, 621, 620,
-    620, 620, 620, 621, 572, 620, 620, 622, 572, 623, 573, 624, 625, 626,
-    627, 573, 572, 622, 576, 572, 578, 628, 629, 625, 630, 572, 572, 572,
-    572, 631, 572, 572, 572, 632, 633, 572, 572, 572, 572, 572, 634, 572,
-    635, 572, 634, 636, 637, 620, 620, 638, 620, 620, 620, 572, 572, 572,
-    572, 572, 572, 572, 639, 572, 572, 576, 572, 572, 640, 641, 615, 642,
-    642, 643, 572, 572, 572, 572, 572, 644, 645, 646, 647, 648, 649, 578,
-    578, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
-    650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
-    650, 650, 650, 650, 650, 578, 578, 578, 578, 578, 578, 578, 578, 578,
-    578, 578, 578, 578, 578, 578, 578, 651, 652, 652, 653, 587, 587, 578,
-    654, 601, 655, 656, 657, 658, 659, 660, 661, 578, 662, 587, 663, 664,
-    665, 666, 647, 578, 578, 590, 654, 666, 667, 668, 669, 587, 587, 587,
-    587, 670, 671, 587, 587, 587, 587, 672, 673, 674, 647, 675, 676, 572,
-    572, 572, 572, 572, 572, 578, 578, 677, 678, 679, 573, 572, 572, 680,
-    572, 572, 572, 681, 572, 572, 572, 572, 682, 572, 683, 684, 120, 120,
-    685, 120, 120, 686, 686, 686, 686, 686, 687, 688, 688, 688, 688, 688,
-    689, 690, 691, 692, 693, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
-    694, 695, 696, 697, 698, 698, 698, 698, 699, 700, 701, 701, 701, 701,
-    701, 701, 701, 702, 703, 704, 367, 367, 369, 120, 369, 369, 369, 369,
-    369, 369, 369, 369, 705, 705, 705, 705, 706, 707, 708, 709, 710, 711,
-    533, 712, 713, 120, 120, 120, 120, 120, 120, 120, 714, 714, 714, 715,
-    714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 716, 120, 714, 714,
-    714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
-    714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 717, 120, 120, 120,
-    718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 729, 729,
-    729, 729, 729, 729, 729, 729, 730, 731, 732, 733, 733, 733, 733, 733,
-    733, 733, 733, 733, 733, 734, 735, 736, 736, 736, 736, 737, 738, 365,
-    365, 365, 365, 365, 365, 365, 365, 365, 365, 739, 740, 741, 736, 736,
-    736, 742, 718, 718, 718, 718, 719, 120, 733, 733, 743, 743, 743, 744,
-    745, 746, 741, 741, 741, 747, 748, 749, 743, 743, 743, 750, 745, 746,
-    741, 741, 741, 741, 751, 749, 741, 752, 753, 753, 753, 753, 753, 754,
-    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 741, 741, 741,
-    755, 756, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 757,
-    741, 741, 741, 755, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 759, 760, 572, 572, 572, 572, 572, 572, 572, 572, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 760, 760, 760,
-    760, 760, 761, 761, 762, 761, 761, 761, 761, 761, 761, 761, 761, 761,
-    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
-    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
-    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
-    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
-    761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 763,
-    764, 764, 764, 764, 764, 764, 765, 120, 766, 766, 766, 766, 766, 767,
-    768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
-    768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
-    768, 768, 768, 768, 768, 769, 768, 768, 770, 771, 120, 120, 101, 101,
-    101, 101, 101, 772, 773, 774, 101, 101, 101, 775, 776, 776, 776, 776,
-    776, 776, 776, 776, 777, 778, 779, 120, 64, 64, 780, 781, 782, 27, 783,
-    27, 27, 27, 27, 27, 27, 27, 784, 785, 27, 786, 787, 27, 27, 788, 789,
-    120, 120, 120, 120, 120, 120, 120, 790, 791, 792, 793, 794, 794, 795,
-    796, 797, 798, 799, 799, 799, 799, 799, 799, 800, 120, 801, 802, 802,
-    802, 802, 802, 803, 804, 805, 806, 807, 808, 809, 809, 810, 811, 812,
-    813, 814, 814, 815, 816, 817, 817, 818, 819, 820, 821, 365, 365, 365,
-    822, 823, 824, 824, 824, 824, 824, 825, 826, 827, 828, 829, 830, 831,
-    346, 350, 832, 833, 833, 833, 833, 833, 834, 835, 120, 836, 837, 838,
-    839, 346, 346, 840, 841, 842, 842, 842, 842, 842, 842, 843, 844, 845,
-    120, 120, 846, 847, 848, 849, 120, 850, 850, 850, 120, 369, 369, 54, 54,
-    54, 54, 54, 851, 852, 120, 853, 853, 853, 853, 853, 853, 853, 853, 853,
-    853, 847, 847, 847, 847, 854, 855, 856, 857, 365, 365, 365, 365, 365,
-    365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
-    365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
-    365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
-    365, 365, 365, 365, 365, 858, 120, 366, 366, 859, 860, 366, 366, 366,
-    366, 366, 861, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
-    862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
-    862, 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, 863, 863, 863,
-    863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
-    863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 864, 760, 760, 760,
-    760, 865, 120, 866, 867, 121, 868, 869, 870, 871, 121, 128, 128, 128,
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 872, 873, 874, 120, 875,
+    120, 120, 120, 120, 128, 128, 169, 170, 120, 120, 171, 126, 172, 173,
+    174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177,
+    182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193,
+    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206,
+    207, 208, 209, 210, 211, 212, 213, 120, 214, 215, 216, 217, 217, 218,
+    219, 220, 221, 222, 223, 120, 224, 225, 226, 227, 228, 229, 230, 231,
+    231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 120, 242, 243,
+    244, 245, 246, 243, 247, 248, 249, 250, 251, 120, 252, 253, 254, 255,
+    256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266,
+    120, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277,
+    278, 279, 280, 120, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287,
+    288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299,
+    296, 300, 301, 302, 303, 304, 305, 120, 306, 307, 307, 307, 307, 307,
+    308, 309, 310, 311, 312, 313, 120, 120, 120, 120, 314, 315, 316, 317,
+    318, 319, 320, 321, 322, 323, 324, 325, 120, 120, 120, 120, 326, 327,
+    328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338,
+    339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 120, 120,
+    120, 120, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355,
+    356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364,
+    365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367,
+    367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369,
+    369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370,
+    370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371,
+    370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370,
+    370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375,
+    376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380,
+    380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384,
+    386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390,
+    391, 392, 393, 394, 395, 120, 396, 396, 397, 120, 398, 398, 399, 120,
+    400, 401, 402, 120, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407,
+    408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418,
+    419, 418, 418, 418, 418, 418, 418, 120, 420, 418, 418, 418, 418, 421,
+    384, 384, 384, 384, 384, 384, 384, 384, 422, 120, 423, 423, 423, 424,
+    425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 120, 434, 434,
+    434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439,
+    440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447,
+    448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 120, 120, 120, 120,
+    120, 120, 120, 120, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461,
+    462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473,
+    474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481,
+    482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 120, 120,
+    120, 120, 120, 120, 491, 120, 492, 493, 494, 495, 496, 497, 54, 54, 54,
+    54, 498, 499, 56, 56, 56, 56, 56, 500, 501, 502, 54, 503, 54, 54, 54,
+    504, 56, 56, 56, 505, 506, 507, 508, 509, 509, 509, 510, 511, 27, 27, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 512, 513, 27,
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 516, 517, 514, 515,
+    514, 515, 516, 517, 514, 518, 514, 515, 514, 516, 514, 519, 514, 519,
+    514, 519, 520, 521, 522, 523, 524, 525, 514, 526, 527, 528, 529, 530,
+    531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
+    545, 546, 56, 547, 548, 549, 550, 551, 552, 552, 553, 554, 555, 556, 557,
+    120, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570,
+    571, 570, 572, 573, 574, 575, 576, 577, 578, 579, 580, 579, 581, 582,
+    579, 583, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594,
+    595, 596, 597, 598, 599, 594, 594, 600, 601, 602, 603, 604, 594, 594,
+    605, 585, 606, 607, 594, 594, 608, 594, 594, 579, 609, 610, 611, 612,
+    613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 579, 579, 617,
+    618, 585, 585, 619, 579, 579, 579, 579, 584, 620, 621, 622, 623, 579,
+    579, 579, 579, 623, 120, 120, 120, 579, 624, 120, 120, 625, 625, 625,
+    625, 625, 626, 626, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628,
+    629, 625, 630, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 631,
+    631, 631, 631, 633, 579, 631, 631, 634, 579, 635, 636, 637, 638, 639,
+    640, 636, 579, 634, 641, 579, 642, 643, 644, 645, 646, 579, 579, 579,
+    647, 648, 649, 650, 579, 651, 652, 579, 653, 579, 579, 654, 655, 656,
+    657, 579, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 579,
+    579, 579, 669, 579, 670, 579, 671, 672, 673, 674, 675, 676, 625, 677,
+    677, 678, 579, 579, 579, 669, 679, 680, 681, 682, 683, 684, 685, 585,
+    585, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+    686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+    686, 686, 686, 686, 686, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+    585, 585, 585, 585, 585, 585, 585, 687, 688, 688, 689, 594, 594, 585,
+    690, 691, 692, 693, 694, 695, 696, 697, 698, 585, 699, 594, 700, 701,
+    702, 703, 683, 585, 585, 597, 690, 703, 704, 705, 706, 594, 594, 594,
+    594, 707, 708, 594, 594, 594, 594, 709, 710, 711, 683, 712, 713, 579,
+    579, 579, 714, 579, 579, 585, 585, 715, 716, 717, 636, 579, 579, 718,
+    579, 579, 579, 719, 579, 579, 579, 579, 720, 579, 721, 722, 120, 120,
+    723, 120, 120, 724, 724, 724, 724, 724, 725, 726, 726, 726, 726, 726,
+    727, 728, 729, 730, 731, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+    732, 733, 734, 735, 736, 736, 736, 736, 737, 738, 739, 739, 739, 739,
+    739, 739, 739, 740, 741, 742, 370, 370, 372, 120, 372, 372, 372, 372,
+    372, 372, 372, 372, 743, 743, 743, 743, 744, 745, 746, 747, 748, 749,
+    750, 751, 752, 120, 120, 120, 120, 120, 120, 120, 753, 753, 753, 754,
+    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 755, 120, 753, 753,
+    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753,
+    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 756, 120, 120, 120,
+    757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 769,
+    770, 769, 769, 769, 771, 772, 773, 774, 775, 776, 777, 777, 778, 777,
+    777, 777, 779, 780, 781, 782, 783, 784, 784, 784, 784, 785, 786, 787,
+    787, 787, 787, 787, 787, 787, 787, 787, 787, 788, 789, 790, 784, 784,
+    784, 791, 757, 757, 757, 757, 758, 120, 792, 792, 793, 793, 793, 794,
+    795, 796, 790, 790, 790, 797, 798, 799, 793, 793, 793, 800, 795, 796,
+    790, 790, 790, 790, 801, 799, 790, 802, 803, 803, 803, 803, 803, 804,
+    803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 790, 790, 790,
+    805, 806, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 807,
+    790, 790, 790, 805, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 809, 810, 579, 579, 579, 579, 579, 579, 579, 579, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, 810, 810, 810,
+    810, 810, 811, 811, 812, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 813,
+    814, 814, 814, 814, 814, 814, 815, 120, 816, 816, 816, 816, 816, 817,
+    818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+    818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+    818, 818, 818, 818, 818, 819, 818, 818, 820, 821, 120, 120, 101, 101,
+    101, 101, 101, 822, 823, 824, 101, 101, 101, 825, 826, 826, 826, 826,
+    826, 826, 826, 826, 827, 828, 829, 120, 64, 64, 830, 831, 832, 27, 833,
+    27, 27, 27, 27, 27, 27, 27, 834, 835, 27, 836, 837, 27, 27, 838, 839,
+    120, 120, 120, 120, 120, 120, 120, 840, 841, 842, 843, 844, 844, 845,
+    846, 847, 848, 849, 849, 849, 849, 849, 849, 850, 120, 851, 852, 852,
+    852, 852, 852, 853, 854, 855, 856, 857, 858, 859, 859, 860, 861, 862,
+    863, 864, 864, 865, 866, 867, 867, 868, 869, 870, 871, 367, 367, 367,
+    872, 873, 874, 874, 874, 874, 874, 875, 876, 877, 878, 879, 880, 881,
+    348, 352, 882, 883, 883, 883, 883, 883, 884, 885, 120, 886, 887, 888,
+    889, 348, 348, 890, 891, 892, 892, 892, 892, 892, 892, 893, 894, 895,
+    120, 120, 896, 897, 898, 899, 120, 900, 900, 900, 120, 372, 372, 54, 54,
+    54, 54, 54, 901, 902, 120, 903, 903, 903, 903, 903, 903, 903, 903, 903,
+    903, 897, 897, 897, 897, 904, 905, 906, 907, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+    909, 909, 908, 909, 909, 910, 909, 909, 909, 909, 909, 909, 908, 909,
+    909, 910, 909, 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909,
+    909, 911, 120, 368, 368, 912, 913, 369, 369, 369, 369, 369, 914, 915,
+    915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+    915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+    915, 915, 915, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+    916, 916, 916, 916, 916, 916, 916, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 917, 810, 810, 810, 810, 918, 120, 919,
+    920, 121, 921, 922, 923, 924, 121, 128, 128, 128, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 925, 926, 927, 120, 928, 128, 128, 128, 128,
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 876, 120, 120, 128, 128, 128, 128, 128, 128, 128, 128, 877,
-    128, 128, 128, 128, 128, 128, 120, 120, 120, 120, 120, 128, 878, 879,
-    879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892,
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-    128, 128, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 902,
-    903, 904, 905, 906, 905, 905, 905, 905, 907, 908, 908, 908, 909, 910,
-    910, 910, 911, 912, 913, 120, 914, 915, 916, 915, 915, 917, 915, 915,
-    918, 915, 919, 915, 919, 120, 120, 120, 120, 915, 915, 915, 915, 915,
-    915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 920, 921, 922, 922,
-    922, 922, 922, 923, 607, 924, 924, 924, 924, 924, 924, 925, 926, 927,
-    928, 572, 929, 930, 120, 120, 120, 120, 120, 607, 607, 607, 607, 607,
-    931, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 932, 932, 932, 933, 934, 934, 934, 934, 934, 934, 935,
-    120, 936, 937, 937, 938, 939, 939, 939, 939, 940, 120, 941, 941, 942,
-    943, 944, 944, 944, 944, 945, 946, 947, 947, 947, 948, 949, 949, 949,
-    949, 950, 949, 951, 120, 120, 120, 120, 120, 952, 952, 952, 952, 952,
-    953, 953, 953, 953, 953, 954, 954, 954, 954, 954, 954, 955, 955, 955,
-    956, 957, 958, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 959,
-    959, 959, 959, 959, 120, 960, 960, 960, 960, 960, 960, 961, 962, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
-    963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
-    963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 964,
-    120, 963, 963, 965, 120, 963, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 966, 967, 968,
-    968, 968, 968, 969, 970, 971, 971, 972, 973, 974, 974, 975, 976, 977,
-    977, 977, 978, 979, 980, 120, 120, 120, 120, 120, 120, 981, 981, 982,
-    983, 984, 984, 985, 986, 987, 987, 987, 988, 120, 120, 120, 120, 120,
-    120, 120, 120, 989, 989, 989, 989, 990, 990, 990, 991, 992, 992, 993,
-    992, 992, 992, 992, 992, 994, 995, 996, 997, 998, 998, 999, 1000, 1001,
-    120, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1006, 1006, 1007, 120,
-    120, 120, 120, 1008, 1009, 1008, 1008, 1010, 1011, 1012, 120, 1013, 1013,
-    1013, 1013, 1013, 1013, 1014, 1015, 1016, 1016, 1017, 1018, 1019, 1019,
-    1020, 1021, 1022, 1022, 1023, 1024, 120, 1025, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-    1026, 1027, 120, 120, 120, 120, 120, 120, 1028, 1028, 1028, 1028, 1028,
-    1028, 1029, 120, 1030, 1030, 1030, 1030, 1030, 1030, 1031, 1032, 120,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 929, 120,
+    120, 128, 128, 128, 128, 128, 128, 128, 128, 930, 128, 128, 128, 128,
+    128, 128, 120, 120, 120, 120, 120, 128, 931, 932, 932, 933, 934, 935,
+    936, 937, 938, 939, 940, 941, 942, 943, 944, 169, 128, 128, 128, 128,
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 945, 946,
+    947, 948, 949, 950, 951, 951, 952, 953, 954, 954, 955, 956, 957, 958,
+    959, 959, 959, 959, 960, 961, 961, 961, 962, 963, 963, 963, 964, 965,
+    966, 120, 967, 968, 969, 968, 968, 970, 968, 968, 971, 968, 972, 968,
+    972, 120, 120, 120, 120, 968, 968, 968, 968, 968, 968, 968, 968, 968,
+    968, 968, 968, 968, 968, 968, 973, 974, 975, 975, 975, 975, 975, 976,
+    615, 977, 977, 977, 977, 977, 977, 978, 979, 980, 981, 579, 982, 983,
+    120, 120, 120, 120, 120, 615, 615, 615, 615, 615, 984, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 985,
+    985, 985, 986, 987, 987, 987, 987, 987, 987, 988, 120, 989, 990, 990,
+    991, 992, 992, 992, 992, 993, 120, 994, 994, 995, 996, 997, 997, 997,
+    997, 998, 999, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1003,
+    1002, 1004, 120, 120, 120, 120, 120, 1005, 1005, 1005, 1005, 1005, 1006,
+    1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, 1007, 1008, 1008,
+    1008, 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1014, 1014, 1014,
+    1014, 1015, 1016, 1016, 1016, 1016, 1016, 120, 1017, 1017, 1017, 1017,
+    1017, 1017, 1018, 1019, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 1020, 1020, 1020, 1020, 1020,
+    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 120, 1020,
+    1020, 1022, 120, 1020, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 1023, 1024, 1025, 1025,
+    1025, 1025, 1026, 1027, 1028, 1028, 1029, 1030, 1031, 1031, 1032, 1033,
+    1034, 1034, 1034, 1035, 1036, 1037, 120, 120, 120, 120, 120, 120, 1038,
+    1038, 1039, 1040, 1041, 1041, 1042, 1043, 1044, 1044, 1044, 1045, 120,
+    120, 120, 120, 120, 120, 120, 120, 1046, 1046, 1046, 1046, 1047, 1047,
+    1047, 1048, 1049, 1049, 1050, 1049, 1049, 1049, 1049, 1049, 1051, 1052,
+    1053, 1054, 1055, 1055, 1056, 1057, 1058, 120, 1059, 1060, 1061, 1061,
+    1061, 1062, 1063, 1063, 1063, 1064, 120, 120, 120, 120, 1065, 1066, 1065,
+    1065, 1067, 1068, 1069, 120, 1070, 1070, 1070, 1070, 1070, 1070, 1071,
+    1072, 1073, 1073, 1074, 1075, 1076, 1076, 1077, 1078, 1079, 1079, 1080,
+    1081, 120, 1082, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1083,
+    1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 120, 120, 120, 120,
+    120, 120, 1085, 1085, 1085, 1085, 1085, 1085, 1086, 120, 1087, 1087,
+    1087, 1087, 1087, 1087, 1088, 1089, 120, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 1090, 1090, 1090, 1091, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 1033, 1033, 1033, 1034, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 1035, 1036, 1036, 1036, 1036, 1036,
-    1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 120, 1044, 1045, 1046,
-    1046, 1046, 1046, 1046, 1047, 1048, 1049, 120, 1050, 1050, 1050, 1051,
-    1052, 1053, 1054, 1055, 1055, 1055, 1056, 1057, 1058, 1059, 1060, 120,
-    1061, 1061, 1061, 1061, 1062, 120, 1063, 1064, 1064, 1064, 1064, 1064,
-    1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 120, 1074, 1074,
-    1075, 1074, 1074, 1076, 1077, 1078, 120, 120, 120, 120, 120, 120, 120,
-    120, 1079, 1080, 1081, 1082, 1081, 1083, 1084, 1084, 1084, 1084, 1084,
-    1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1093, 1094, 1095,
-    1096, 1097, 1098, 1099, 1100, 1101, 1102, 1102, 120, 120, 120, 120, 120,
+    120, 1092, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1095, 1096, 1097,
+    1098, 1099, 1100, 120, 1101, 1102, 1103, 1103, 1103, 1103, 1103, 1104,
+    1105, 1106, 120, 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1112,
+    1112, 1113, 1114, 1115, 1116, 1117, 120, 1118, 1118, 1118, 1118, 1119,
+    120, 1120, 1121, 1121, 1121, 1121, 1121, 1122, 1123, 1124, 1125, 1126,
+    1127, 1128, 1129, 1130, 120, 1131, 1131, 1132, 1131, 1131, 1133, 1134,
+    1135, 120, 120, 120, 120, 120, 120, 120, 120, 1136, 1137, 1138, 1139,
+    1138, 1140, 1141, 1141, 1141, 1141, 1141, 1142, 1143, 1144, 1145, 1146,
+    1147, 1148, 1149, 1150, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157,
+    1158, 1159, 1159, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 1160, 1160, 1160, 1160, 1160, 1160, 1161,
+    1162, 1163, 1164, 1165, 1166, 120, 120, 120, 120, 1167, 1167, 1167, 1167,
+    1167, 1167, 1168, 1169, 1170, 120, 1171, 1172, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 1173, 1173, 1173, 1173, 1173, 1174, 1175, 1176, 1177, 1178, 1179,
+    1180, 120, 120, 120, 120, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1183,
+    1184, 120, 1185, 1186, 1187, 1188, 120, 120, 1189, 1189, 1189, 1189,
+    1189, 1190, 1191, 120, 1192, 1193, 120, 120, 120, 120, 120, 120, 1194,
+    1194, 1194, 1195, 1196, 1197, 1198, 1199, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    1103, 1103, 1103, 1103, 1103, 1103, 1104, 1105, 1106, 120, 1107, 1108,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1200, 1200, 1200, 1200,
+    1201, 1201, 1201, 1201, 1202, 1203, 1204, 1205, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 1109, 1109, 1109, 1109, 1109, 1110, 1111,
-    1112, 1113, 1114, 1114, 1115, 120, 120, 120, 120, 1116, 1116, 1116, 1116,
-    1116, 1116, 1117, 1118, 1119, 120, 1120, 1121, 120, 120, 120, 120, 1122,
-    1122, 1122, 1122, 1122, 1123, 1124, 120, 1125, 1126, 120, 120, 120, 120,
-    120, 120, 1127, 1127, 1127, 1128, 1129, 1130, 1131, 1132, 120, 120, 120,
+    120, 120, 120, 120, 120, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1207,
+    1208, 1209, 1208, 1208, 1208, 1210, 1211, 1212, 1213, 120, 1214, 1215,
+    1216, 1217, 1218, 1219, 1219, 1219, 1220, 1221, 1221, 1222, 1223, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 1224, 1224, 1224, 1224, 1224,
+    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1226, 1226, 1226,
+    1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227, 1228,
+    120, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+    1224, 1229, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1231, 1230, 1230, 1230, 1230, 1232, 1233, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1234, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+    1230, 1230, 1235, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1236,
+    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+    1236, 1238, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 826, 826, 826,
+    826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+    826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+    826, 826, 826, 826, 826, 826, 826, 826, 1239, 1240, 1240, 1240, 1241,
+    1242, 1243, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    1244, 1244, 1244, 1245, 1246, 120, 1247, 1247, 1247, 1247, 1247, 1247,
+    1248, 1249, 1250, 120, 1251, 1252, 1253, 1247, 1247, 1254, 1247, 1247,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1133,
-    1133, 1133, 1133, 1134, 1134, 1134, 1134, 1135, 1136, 1137, 1138, 120,
+    1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1256, 120, 1257, 1258,
+    1258, 1258, 1258, 1259, 120, 1260, 1261, 1262, 120, 120, 120, 120, 120,
+    120, 120, 120, 1263, 120, 120, 120, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1265, 120, 120, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+    1264, 1264, 1264, 1264, 1266, 120, 1267, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 1139, 1139, 1139, 1139,
-    1139, 1139, 1139, 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1142, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 1143, 1143, 1143, 1143, 1143, 1143,
-    1143, 1143, 1143, 1143, 1143, 1143, 1143, 1144, 1145, 120, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
-    1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1146, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, 1268, 1268,
+    1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1269, 1268,
+    1270, 1268, 1271, 1268, 1272, 1273, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+    615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+    615, 615, 615, 615, 615, 615, 1274, 120, 615, 615, 615, 615, 1275, 1276,
+    615, 615, 615, 615, 615, 615, 1277, 1278, 1279, 1280, 1281, 1282, 615,
+    615, 615, 1283, 615, 615, 615, 615, 615, 615, 615, 1284, 120, 120, 980,
+    980, 980, 980, 980, 980, 980, 980, 1285, 120, 120, 120, 120, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 1147, 1147, 1147, 1147, 1147,
-    1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
-    1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
-    1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1148, 120, 120, 120, 120,
+    120, 120, 120, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 623,
+    120, 975, 975, 1286, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 1287, 1287, 1287, 1288, 1289, 1289,
+    1290, 1287, 1287, 1291, 1292, 1289, 1289, 1287, 1287, 1287, 1288, 1289,
+    1289, 1293, 1294, 1295, 1291, 1296, 1297, 1289, 1287, 1287, 1287, 1288,
+    1289, 1289, 1298, 1299, 1300, 1301, 1289, 1289, 1289, 1302, 1303, 1304,
+    1305, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 1287,
+    1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287,
+    1287, 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289,
+    1287, 1287, 1287, 1288, 1289, 1289, 1306, 1287, 1287, 1287, 1307, 1289,
+    1289, 1308, 1309, 1287, 1287, 1310, 1289, 1289, 1311, 1290, 1287, 1287,
+    1312, 1289, 1289, 1313, 1314, 1287, 1287, 1315, 1289, 1289, 1289, 1316,
+    1287, 1287, 1287, 1307, 1289, 1289, 1308, 1317, 1318, 1318, 1318, 1318,
+    1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+    1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+    1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320, 1320,
+    1320, 1320, 1320, 1320, 1321, 1322, 1320, 1320, 1320, 1320, 1320, 1323,
+    1324, 1319, 1325, 1326, 120, 1327, 1328, 1320, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 1329, 1330, 1330, 1331, 1332, 1333, 120, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 1149, 1149, 1149, 1149, 1149,
-    1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
-    1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
-    1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1150,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1334, 1334, 1334, 1334,
+    1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334,
+    1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1336, 1337, 120,
+    120, 120, 120, 120, 1338, 1338, 1338, 1338, 1339, 1340, 1340, 1340, 1341,
+    1342, 1343, 1344, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 1345, 128, 128, 128, 1346,
+    1347, 1348, 1349, 1350, 1351, 1346, 1352, 1346, 1348, 1348, 1353, 128,
+    1354, 128, 1355, 1356, 1354, 128, 1355, 120, 120, 120, 120, 120, 120,
+    1357, 120, 1358, 1359, 1359, 1359, 1359, 1360, 1359, 1359, 1359, 1359,
+    1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1361, 1359, 1362,
+    1363, 1359, 1363, 1364, 1363, 1359, 1359, 1359, 1365, 1361, 626, 1366,
+    628, 628, 628, 1367, 628, 628, 628, 628, 628, 628, 628, 1368, 628, 628,
+    628, 1369, 1370, 1371, 628, 1372, 1361, 1361, 1361, 1361, 1361, 1361,
+    1373, 1374, 1374, 1374, 1375, 1361, 790, 790, 790, 790, 790, 1376, 790,
+    1377, 1378, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757,
+    757, 757, 757, 1379, 1380, 1381, 757, 757, 757, 757, 757, 757, 757, 757,
+    1382, 1383, 757, 1384, 1385, 757, 757, 1386, 1387, 1388, 1389, 1384,
+    1359, 757, 757, 1390, 1391, 757, 757, 757, 757, 757, 757, 757, 1392,
+    1393, 1394, 1395, 757, 1396, 1397, 1394, 1398, 1399, 757, 757, 757, 1400,
+    1401, 1402, 757, 757, 757, 757, 757, 757, 757, 757, 1403, 1404, 757,
+    1405, 649, 1406, 757, 1407, 1408, 579, 1409, 757, 757, 757, 1359, 1410,
+    1411, 1359, 1359, 1412, 1359, 1358, 1359, 1359, 1359, 1359, 1359, 1413,
+    1414, 1359, 1359, 1413, 1415, 757, 757, 757, 757, 757, 757, 757, 757,
+    1416, 1417, 579, 579, 579, 579, 1418, 1419, 757, 757, 757, 757, 1420,
+    757, 1421, 757, 1422, 1358, 1423, 1361, 1359, 1424, 1425, 1361, 579, 579,
+    579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1426, 1361,
+    579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1427, 1361, 1361, 1361,
+    1361, 1361, 579, 1426, 579, 579, 579, 579, 579, 579, 579, 1361, 579,
+    1428, 579, 579, 579, 579, 579, 1361, 579, 579, 579, 1429, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 1430,
+    1431, 1361, 1432, 1433, 757, 1434, 757, 1435, 1361, 1361, 1361, 1361,
+    757, 757, 1436, 1361, 1361, 1361, 1361, 1361, 1437, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1438, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 1439, 810, 810, 810, 810, 810, 808,
+    808, 808, 808, 808, 808, 1440, 810, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 917,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 808, 808, 808, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 810, 1441, 1442, 120, 120, 120, 1443,
+    1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 120,
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 776, 776, 776, 776, 776,
-    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
-    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
-    776, 776, 776, 776, 776, 776, 1151, 1152, 1152, 1152, 1153, 1154, 1155,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1156, 1156,
-    1156, 1157, 1158, 120, 1159, 1159, 1159, 1159, 1159, 1159, 1160, 1161,
-    1162, 120, 1163, 1164, 1165, 1159, 1159, 1166, 1159, 1159, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1167, 1167, 1167,
-    1167, 1167, 1167, 1167, 1167, 1168, 120, 1169, 1170, 1170, 1170, 1170,
-    1171, 120, 1172, 1173, 1174, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 1175, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 1176, 1176, 1176, 1176, 1176, 1176,
-    1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, 1176, 1178, 1176, 1179,
-    1176, 1180, 1181, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
-    607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
-    607, 607, 1182, 120, 607, 607, 607, 607, 1183, 1184, 607, 607, 607, 607,
-    607, 607, 1185, 1186, 1187, 1188, 1189, 1190, 607, 607, 607, 1191, 607,
-    607, 607, 607, 607, 607, 607, 1192, 120, 120, 927, 927, 927, 927, 927,
-    927, 927, 927, 1193, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 614, 120, 922, 922, 1194,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 1195, 1195, 1195, 1196, 1197, 1197, 1198, 1195, 1195,
-    1199, 1200, 1197, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1201, 1202,
-    1203, 1199, 1204, 1205, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1206,
-    1207, 1208, 1209, 1197, 1197, 1197, 1210, 1211, 1212, 1213, 1197, 1197,
-    1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196, 1197,
-    1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196,
-    1197, 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195,
-    1196, 1197, 1197, 1214, 1195, 1195, 1195, 1215, 1197, 1197, 1216, 1217,
-    1195, 1195, 1218, 1197, 1197, 1219, 1198, 1195, 1195, 1220, 1197, 1197,
-    1221, 1222, 1195, 1195, 1223, 1197, 1197, 1197, 1224, 1195, 1195, 1195,
-    1215, 1197, 1197, 1216, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1227,
-    1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
-    1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
-    1227, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1228, 1228, 1228, 1228,
-    1228, 1229, 1230, 1228, 1228, 1228, 1228, 1228, 1231, 1232, 1227, 1233,
-    1234, 120, 1235, 1236, 1228, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
-    1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
-    1237, 1238, 1239, 1240, 120, 120, 120, 120, 120, 1241, 128, 128, 128,
-    1242, 1243, 1244, 1245, 1246, 1247, 1242, 1248, 1242, 1244, 1244, 1249,
-    128, 1250, 128, 1251, 1252, 1250, 128, 1251, 120, 120, 120, 120, 120,
-    120, 1253, 120, 572, 572, 572, 572, 572, 929, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 929, 120, 572, 614, 1254, 572, 1254,
-    572, 1254, 572, 572, 572, 681, 120, 616, 1255, 618, 618, 618, 1256, 618,
-    618, 618, 618, 618, 618, 618, 1257, 618, 618, 618, 618, 618, 1258, 120,
-    120, 120, 120, 120, 120, 120, 120, 1259, 607, 607, 607, 1260, 120, 741,
-    741, 741, 741, 741, 1261, 741, 1262, 1263, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 1264, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1265, 572, 572, 572,
-    572, 1266, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1267, 120, 572,
-    1268, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 572, 572, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572,
-    572, 1268, 120, 120, 120, 120, 120, 572, 929, 572, 572, 572, 572, 572,
-    572, 572, 120, 572, 684, 572, 572, 572, 572, 572, 120, 572, 572, 572,
-    681, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
-    1267, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268,
-    120, 120, 120, 120, 120, 120, 120, 1267, 120, 120, 120, 120, 120, 120,
-    120, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 1269,
-    760, 760, 760, 760, 760, 758, 758, 758, 758, 758, 758, 1270, 760, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
-    758, 758, 758, 758, 758, 864, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 758, 758, 758, 759, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
-    1271, 1272, 120, 120, 120, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
-    1273, 1273, 1273, 1273, 1273, 120, 120, 120, 120, 120, 120, 120, 120,
-    120, 120, 120, 120, 120, 120, 120, 120, 879, 879, 879, 879, 879, 879,
-    879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879,
-    879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 120, 120, 863, 863,
-    863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
-    863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
-    863, 1274,
+    120, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+    932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+    932, 932, 932, 120, 120, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+    916, 916, 916, 916, 916, 916, 916, 916, 1444,
 };
 
 static const unsigned short index2[] = {
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2,
-    5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14,
-    14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17,
-    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20,
-    20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16,
-    10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26,
-    27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35,
-    36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37,
-    37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40,
-    40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41,
-    40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41,
-    37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41,
-    37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40,
-    37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38,
-    40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40,
-    37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41,
-    37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37,
-    37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37,
-    41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42,
-    37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37,
-    40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41,
-    41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41,
-    37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41,
-    41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46,
-    46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46,
-    47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44,
-    44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47,
-    47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53,
-    53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53,
-    53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53,
-    53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53,
-    53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59,
-    60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64,
-    65, 62, 62, 62, 66, 61, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64,
-    61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-    67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62,
-    62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-    62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61,
-    61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70,
-    69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61,
-    62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72,
-    72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74,
-    74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-    75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77,
-    79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72,
-    75, 72, 75, 72, 75, 75, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
-    80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82,
-    82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
-    64, 84, 85, 64, 64, 86, 86, 87, 64, 88, 89, 89, 89, 89, 88, 89, 89, 89,
-    90, 88, 89, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 89, 89, 88, 89,
-    89, 90, 91, 89, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103,
-    104, 105, 106, 107, 108, 109, 107, 89, 88, 107, 100, 64, 64, 64, 64, 64,
-    64, 64, 64, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 64,
-    64, 64, 64, 64, 110, 110, 110, 107, 107, 64, 64, 64, 111, 111, 111, 111,
-    111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 120,
-    120, 120, 120, 120, 120, 120, 121, 122, 123, 124, 125, 64, 118, 124, 126,
-    126, 126, 126, 126, 126, 126, 126, 127, 126, 126, 126, 126, 126, 126,
-    126, 126, 126, 126, 128, 129, 130, 131, 132, 133, 134, 135, 78, 78, 136,
-    137, 120, 120, 120, 120, 120, 137, 120, 120, 137, 138, 138, 138, 138,
-    138, 138, 138, 138, 138, 138, 115, 139, 139, 118, 126, 126, 140, 126,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 118, 126, 120, 120,
-    120, 120, 120, 120, 120, 112, 119, 120, 120, 120, 120, 137, 120, 141,
-    141, 120, 120, 119, 137, 120, 120, 137, 126, 126, 142, 142, 142, 142,
-    142, 142, 142, 142, 142, 142, 126, 126, 126, 143, 143, 126, 144, 144,
-    144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 145, 146,
-    147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
-    146, 148, 149, 148, 148, 149, 148, 148, 149, 149, 149, 148, 149, 149,
-    148, 149, 148, 148, 148, 149, 148, 149, 148, 149, 148, 149, 148, 148, 64,
-    64, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-    150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-    150, 64, 64, 64, 64, 64, 64, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-    152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-    153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 155, 154, 156,
-    156, 157, 158, 158, 158, 156, 64, 64, 64, 64, 64, 159, 159, 159, 159,
-    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-    161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160,
-    161, 160, 160, 160, 160, 160, 64, 64, 162, 162, 162, 162, 162, 162, 162,
-    162, 162, 162, 162, 162, 162, 162, 162, 64, 163, 163, 163, 163, 163, 163,
-    163, 163, 163, 164, 164, 164, 64, 64, 165, 64, 126, 126, 126, 126, 126,
-    64, 64, 64, 64, 64, 64, 137, 120, 120, 137, 120, 120, 137, 120, 120, 120,
-    137, 137, 137, 166, 167, 168, 120, 120, 120, 137, 120, 120, 137, 137,
-    120, 120, 120, 120, 120, 169, 169, 169, 170, 171, 171, 171, 171, 171,
-    171, 171, 171, 171, 171, 171, 171, 171, 171, 169, 170, 172, 171, 170,
-    170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-    173, 170, 170, 171, 78, 136, 174, 174, 169, 169, 169, 171, 171, 169, 169,
-    84, 84, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 177, 171,
-    171, 171, 171, 171, 171, 178, 179, 180, 180, 64, 178, 178, 178, 178, 178,
-    178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178,
-    178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178,
-    178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 181, 178, 180, 180,
-    180, 179, 179, 179, 179, 64, 64, 180, 180, 64, 64, 180, 180, 182, 178,
-    64, 64, 64, 64, 64, 64, 64, 64, 180, 64, 64, 64, 64, 178, 178, 64, 178,
-    178, 178, 179, 179, 64, 64, 183, 183, 183, 183, 183, 183, 183, 183, 183,
-    183, 178, 178, 184, 184, 185, 185, 185, 185, 185, 185, 186, 184, 64, 64,
-    64, 64, 64, 187, 187, 188, 64, 189, 189, 189, 189, 189, 189, 64, 64, 64,
-    64, 189, 189, 64, 64, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
-    189, 189, 189, 189, 64, 189, 189, 189, 189, 189, 189, 189, 64, 189, 189,
-    64, 189, 189, 64, 189, 189, 64, 64, 190, 64, 188, 188, 188, 187, 187, 64,
-    64, 64, 64, 187, 187, 64, 64, 187, 187, 191, 64, 64, 64, 187, 64, 64, 64,
-    64, 64, 64, 64, 189, 189, 189, 189, 64, 189, 64, 64, 64, 64, 64, 64, 64,
-    192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 187, 187, 189, 189,
-    189, 187, 64, 64, 64, 193, 193, 194, 64, 195, 195, 195, 195, 195, 195,
-    195, 195, 195, 64, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
-    195, 195, 195, 195, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
-    64, 195, 195, 64, 195, 195, 195, 195, 195, 64, 64, 196, 195, 194, 194,
-    194, 193, 193, 193, 193, 193, 64, 193, 193, 194, 64, 194, 194, 197, 64,
-    64, 195, 64, 64, 64, 64, 64, 64, 64, 195, 195, 193, 193, 64, 64, 198,
-    198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 200, 64, 64, 64, 64,
-    64, 64, 64, 195, 64, 64, 64, 64, 64, 64, 64, 201, 202, 202, 64, 203, 203,
-    203, 203, 203, 203, 203, 203, 64, 64, 203, 203, 64, 64, 203, 203, 203,
-    203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 64, 203, 203, 203,
-    203, 203, 203, 203, 64, 203, 203, 64, 203, 203, 203, 203, 203, 64, 64,
-    204, 203, 202, 201, 202, 201, 201, 201, 201, 64, 64, 202, 202, 64, 64,
-    202, 202, 205, 64, 64, 64, 64, 64, 64, 64, 64, 201, 202, 64, 64, 64, 64,
-    203, 203, 64, 203, 203, 203, 201, 201, 64, 64, 206, 206, 206, 206, 206,
-    206, 206, 206, 206, 206, 207, 203, 208, 208, 208, 208, 208, 208, 64, 64,
-    209, 210, 64, 210, 210, 210, 210, 210, 210, 64, 64, 64, 210, 210, 210,
-    64, 210, 210, 210, 210, 64, 64, 64, 210, 210, 64, 210, 64, 210, 210, 64,
-    64, 64, 210, 210, 64, 64, 64, 210, 210, 210, 210, 210, 210, 210, 210,
-    210, 210, 64, 64, 64, 64, 211, 211, 209, 211, 211, 64, 64, 64, 211, 211,
-    211, 64, 211, 211, 211, 212, 64, 64, 210, 64, 64, 64, 64, 64, 64, 211,
-    64, 64, 64, 64, 64, 64, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
-    214, 214, 214, 215, 215, 215, 215, 215, 215, 216, 215, 64, 64, 64, 64,
-    64, 217, 218, 218, 218, 64, 219, 219, 219, 219, 219, 219, 219, 219, 64,
-    219, 219, 219, 64, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-    219, 219, 219, 219, 219, 64, 64, 64, 219, 217, 217, 217, 218, 218, 218,
-    218, 64, 217, 217, 217, 64, 217, 217, 217, 220, 64, 64, 64, 64, 64, 64,
-    64, 221, 222, 64, 219, 219, 219, 64, 64, 64, 64, 64, 219, 219, 217, 217,
-    64, 64, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224,
-    224, 224, 224, 224, 225, 64, 226, 227, 227, 64, 228, 228, 228, 228, 228,
-    228, 228, 228, 64, 228, 228, 228, 64, 228, 228, 228, 228, 228, 228, 228,
-    228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 64, 228, 228, 228,
-    228, 228, 64, 64, 229, 228, 227, 230, 227, 227, 227, 227, 227, 64, 230,
-    227, 227, 64, 227, 227, 226, 231, 64, 64, 64, 64, 64, 64, 64, 227, 227,
-    64, 64, 64, 64, 64, 64, 64, 228, 64, 228, 228, 226, 226, 64, 64, 232,
-    232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 228, 228, 64, 64, 64,
-    64, 64, 64, 233, 234, 234, 64, 235, 235, 235, 235, 235, 235, 235, 235,
-    64, 235, 235, 235, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
-    235, 235, 235, 235, 235, 235, 235, 64, 64, 235, 234, 234, 234, 233, 233,
-    233, 233, 64, 234, 234, 234, 64, 234, 234, 234, 236, 235, 64, 64, 64, 64,
-    64, 64, 64, 64, 234, 64, 64, 64, 64, 64, 64, 64, 235, 235, 235, 233, 233,
-    64, 64, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238,
-    238, 238, 238, 64, 64, 64, 239, 235, 235, 235, 235, 235, 235, 64, 64,
-    240, 240, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
-    241, 241, 241, 241, 241, 241, 64, 64, 64, 241, 241, 241, 241, 241, 241,
-    241, 241, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 64, 241, 64,
-    64, 64, 64, 242, 64, 64, 64, 64, 240, 240, 240, 243, 243, 243, 64, 243,
-    64, 240, 240, 240, 240, 240, 240, 240, 240, 64, 64, 64, 64, 64, 64, 244,
-    244, 244, 244, 244, 244, 244, 244, 244, 244, 64, 64, 240, 240, 245, 64,
-    64, 64, 64, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
-    246, 246, 246, 246, 247, 246, 246, 247, 247, 247, 247, 248, 248, 249, 64,
-    64, 64, 64, 250, 246, 246, 246, 246, 246, 246, 251, 247, 252, 252, 252,
-    252, 247, 247, 247, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254,
-    254, 253, 253, 64, 64, 64, 64, 64, 255, 255, 64, 255, 64, 64, 255, 255,
-    64, 255, 64, 64, 255, 64, 64, 64, 64, 64, 64, 255, 255, 255, 255, 64,
-    255, 255, 255, 255, 255, 255, 255, 64, 255, 255, 255, 64, 255, 64, 255,
-    64, 64, 255, 255, 64, 255, 255, 255, 255, 256, 255, 255, 256, 256, 256,
-    256, 257, 257, 64, 256, 256, 255, 64, 64, 255, 255, 255, 255, 255, 64,
-    258, 64, 259, 259, 259, 259, 256, 256, 64, 64, 260, 260, 260, 260, 260,
-    260, 260, 260, 260, 260, 64, 64, 255, 255, 255, 255, 261, 262, 262, 262,
-    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
-    263, 262, 263, 262, 262, 262, 264, 264, 262, 262, 262, 262, 262, 262,
-    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266,
-    266, 266, 266, 266, 266, 266, 262, 264, 262, 264, 262, 267, 268, 269,
-    268, 269, 270, 270, 261, 261, 261, 261, 261, 261, 261, 261, 64, 261, 261,
-    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 64, 64, 64, 64, 271,
-    272, 273, 274, 273, 273, 273, 273, 273, 272, 272, 272, 272, 273, 270,
-    272, 273, 275, 275, 276, 263, 275, 275, 261, 261, 261, 261, 261, 273,
-    273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 64, 273, 273, 273, 273,
-    273, 273, 273, 273, 273, 273, 273, 273, 64, 262, 262, 262, 262, 262, 262,
-    262, 262, 264, 262, 262, 262, 262, 262, 262, 64, 262, 262, 263, 263, 263,
-    263, 263, 277, 277, 277, 277, 263, 263, 64, 64, 64, 64, 64, 278, 278,
-    278, 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280, 280,
-    280, 279, 280, 280, 280, 280, 280, 281, 279, 282, 282, 279, 279, 280,
-    280, 278, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284,
-    284, 284, 284, 284, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280,
-    278, 278, 278, 278, 280, 280, 280, 278, 279, 279, 279, 278, 278, 279,
-    279, 279, 279, 279, 279, 279, 278, 278, 278, 280, 280, 280, 280, 278,
-    278, 278, 278, 278, 280, 279, 279, 280, 280, 279, 279, 279, 279, 279,
-    279, 285, 278, 279, 283, 283, 279, 279, 279, 280, 286, 286, 287, 287,
-    287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 287, 64,
-    64, 64, 64, 64, 287, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288,
-    288, 288, 84, 289, 288, 288, 288, 290, 290, 290, 290, 290, 290, 290, 290,
-    291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292,
-    292, 292, 292, 64, 292, 292, 292, 292, 64, 64, 292, 292, 292, 292, 292,
-    292, 292, 64, 292, 292, 292, 64, 64, 293, 293, 293, 294, 294, 294, 294,
-    294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, 295,
-    295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 64, 64, 64, 296,
-    296, 296, 296, 296, 296, 296, 296, 296, 296, 64, 64, 64, 64, 64, 64, 297,
-    297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 64, 64,
-    298, 298, 298, 298, 298, 298, 64, 64, 299, 300, 300, 300, 300, 300, 300,
-    300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
-    301, 301, 300, 302, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
-    303, 303, 303, 303, 303, 303, 303, 303, 304, 305, 64, 64, 64, 306, 306,
-    306, 306, 306, 306, 306, 306, 306, 306, 306, 84, 84, 84, 307, 307, 307,
-    306, 306, 306, 306, 306, 306, 306, 306, 64, 64, 64, 64, 64, 64, 64, 308,
-    308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 64, 308, 308,
-    308, 308, 309, 309, 310, 64, 64, 64, 311, 311, 311, 311, 311, 311, 311,
-    311, 311, 311, 312, 312, 313, 84, 84, 64, 314, 314, 314, 314, 314, 314,
-    314, 314, 314, 314, 315, 315, 64, 64, 64, 64, 316, 316, 316, 316, 316,
-    316, 316, 316, 316, 316, 316, 316, 316, 64, 316, 316, 316, 64, 317, 317,
-    64, 64, 64, 64, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318,
-    318, 319, 319, 320, 319, 319, 319, 319, 319, 319, 319, 320, 320, 320,
-    320, 320, 320, 320, 320, 319, 320, 320, 319, 319, 319, 319, 319, 319,
-    319, 319, 319, 321, 319, 322, 322, 322, 323, 322, 322, 322, 324, 318,
-    325, 64, 64, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 64, 64,
-    64, 64, 64, 64, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 64, 64,
-    64, 64, 64, 64, 328, 328, 66, 66, 328, 66, 329, 328, 328, 328, 328, 330,
-    330, 330, 331, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64,
-    64, 64, 64, 64, 64, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
-    333, 334, 333, 333, 333, 333, 333, 335, 333, 64, 64, 64, 64, 64, 300,
-    300, 300, 300, 300, 300, 64, 64, 336, 336, 336, 336, 336, 336, 336, 336,
-    336, 336, 336, 336, 336, 336, 336, 64, 337, 337, 337, 338, 338, 338, 338,
-    337, 337, 338, 338, 338, 64, 64, 64, 64, 338, 338, 337, 338, 338, 338,
-    338, 338, 338, 339, 340, 341, 64, 64, 64, 64, 342, 64, 64, 64, 343, 343,
-    344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345,
-    345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 64, 64, 345, 345, 345,
-    345, 345, 64, 64, 64, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
-    346, 346, 64, 64, 64, 64, 346, 346, 64, 64, 64, 64, 64, 64, 347, 347,
-    347, 347, 347, 347, 347, 347, 347, 347, 348, 64, 64, 64, 349, 349, 350,
-    350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351,
-    351, 351, 351, 351, 351, 351, 351, 351, 352, 353, 354, 354, 355, 64, 64,
-    356, 356, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
-    357, 358, 359, 358, 359, 359, 359, 359, 359, 359, 359, 64, 360, 358, 359,
-    358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 358, 358, 358, 358,
-    358, 358, 359, 359, 361, 361, 361, 361, 361, 361, 361, 361, 64, 64, 362,
-    363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 64, 64, 64, 64, 64, 64,
-    364, 364, 364, 364, 364, 364, 364, 365, 364, 364, 364, 364, 364, 364, 64,
-    64, 78, 78, 78, 78, 78, 136, 136, 136, 136, 136, 136, 78, 78, 136, 366,
-    64, 367, 367, 367, 367, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369,
-    369, 369, 369, 369, 369, 369, 370, 368, 367, 367, 367, 367, 367, 368,
-    367, 368, 368, 368, 368, 368, 367, 368, 371, 369, 369, 369, 369, 369,
-    369, 369, 64, 64, 64, 64, 372, 372, 372, 372, 372, 372, 372, 372, 372,
-    372, 373, 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, 374, 374,
-    374, 374, 374, 374, 375, 376, 375, 375, 375, 375, 375, 375, 375, 374,
-    374, 374, 374, 374, 374, 374, 374, 374, 64, 64, 64, 377, 377, 378, 379,
-    379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 378,
-    377, 377, 377, 377, 378, 378, 377, 377, 380, 381, 377, 377, 379, 379,
-    382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 379, 379, 379, 379,
-    379, 379, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
-    383, 383, 384, 385, 386, 386, 385, 385, 385, 386, 385, 386, 386, 386,
-    387, 387, 64, 64, 64, 64, 64, 64, 64, 64, 388, 388, 388, 388, 389, 389,
-    389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390,
-    390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 390, 390,
-    391, 392, 64, 64, 64, 393, 393, 393, 393, 393, 394, 394, 394, 394, 394,
-    394, 394, 394, 394, 394, 64, 64, 64, 389, 389, 389, 395, 395, 395, 395,
-    395, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396,
-    396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, 398, 398,
-    399, 399, 399, 399, 399, 399, 399, 399, 78, 78, 78, 84, 400, 136, 136,
-    136, 136, 136, 78, 78, 136, 136, 136, 136, 78, 401, 400, 400, 400, 400,
-    400, 400, 400, 402, 402, 402, 402, 136, 402, 402, 402, 402, 401, 401, 78,
-    402, 402, 64, 78, 78, 64, 64, 64, 64, 64, 64, 41, 41, 41, 41, 41, 41, 62,
-    62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65,
-    65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 403, 41, 41,
-    41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-    44, 44, 65, 78, 78, 136, 78, 78, 78, 78, 78, 78, 78, 136, 78, 78, 404,
-    405, 136, 406, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
-    78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 64, 407, 136, 78, 136,
-    37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62,
-    62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62,
-    62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61,
-    64, 61, 408, 408, 408, 408, 408, 408, 408, 408, 62, 62, 62, 62, 62, 64,
-    62, 62, 61, 61, 61, 61, 408, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62,
-    61, 61, 61, 61, 408, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61,
-    61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62,
-    62, 64, 62, 62, 61, 61, 61, 61, 408, 63, 63, 64, 409, 409, 409, 409, 409,
-    409, 409, 409, 409, 409, 409, 410, 411, 411, 412, 413, 414, 415, 415,
-    414, 414, 414, 22, 66, 416, 417, 418, 419, 416, 417, 418, 419, 22, 22,
-    22, 66, 22, 22, 22, 22, 420, 421, 422, 423, 424, 425, 426, 21, 427, 428,
-    427, 427, 428, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 429, 429, 66, 66,
-    66, 430, 431, 432, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 433, 66,
-    429, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 409, 410, 410, 410, 410,
-    410, 64, 434, 435, 436, 437, 410, 410, 410, 410, 410, 410, 438, 44, 64,
-    64, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 440, 438, 33,
-    33, 33, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 64, 44, 44,
-    44, 44, 44, 64, 64, 64, 250, 250, 250, 250, 250, 250, 250, 250, 250, 441,
-    250, 250, 23, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 64, 78,
-    78, 400, 400, 78, 78, 78, 78, 400, 400, 400, 78, 78, 366, 366, 366, 366,
-    78, 366, 366, 366, 400, 400, 78, 136, 78, 400, 400, 136, 136, 136, 136,
-    78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 442, 30, 26, 30, 26, 442, 26, 30,
-    34, 442, 442, 442, 34, 34, 442, 442, 442, 443, 26, 442, 30, 26, 433, 442,
-    442, 442, 442, 442, 26, 26, 26, 30, 30, 26, 442, 26, 67, 26, 442, 26, 37,
-    38, 442, 442, 444, 34, 442, 442, 37, 442, 34, 402, 402, 402, 402, 34, 26,
-    26, 34, 34, 442, 442, 445, 433, 433, 433, 433, 442, 34, 34, 34, 34, 26,
-    433, 26, 26, 41, 277, 446, 446, 446, 36, 36, 446, 446, 446, 446, 446,
-    446, 36, 36, 36, 36, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447,
-    447, 447, 447, 448, 448, 448, 448, 447, 447, 448, 448, 448, 448, 448,
-    448, 448, 448, 448, 37, 41, 448, 448, 448, 448, 36, 26, 26, 64, 64, 64,
-    64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 433, 433, 26, 26, 26, 26,
-    433, 26, 26, 433, 26, 26, 433, 26, 26, 26, 26, 26, 26, 26, 433, 26, 26,
-    26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 26, 433, 433, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 30, 26, 26, 26, 26, 433, 433, 433, 433, 433, 433, 433, 433, 433,
-    433, 433, 433, 39, 445, 449, 449, 445, 433, 433, 39, 449, 445, 445, 449,
-    445, 445, 433, 39, 433, 449, 439, 450, 433, 449, 445, 433, 433, 433, 449,
-    445, 445, 449, 39, 449, 449, 445, 445, 39, 445, 39, 445, 39, 39, 39, 39,
-    449, 449, 445, 449, 445, 445, 445, 445, 445, 39, 39, 39, 39, 433, 445,
-    433, 445, 449, 449, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
-    449, 445, 445, 445, 449, 433, 433, 433, 433, 433, 449, 445, 445, 445,
-    433, 433, 433, 433, 433, 433, 433, 433, 433, 445, 449, 39, 445, 433, 449,
-    449, 449, 449, 445, 445, 449, 449, 433, 433, 449, 449, 445, 445, 449,
-    449, 445, 445, 449, 449, 445, 445, 445, 445, 445, 433, 433, 445, 445,
-    445, 445, 433, 433, 39, 433, 433, 445, 39, 433, 433, 433, 433, 433, 433,
-    433, 433, 445, 445, 433, 39, 445, 445, 445, 433, 433, 433, 433, 433, 445,
-    449, 433, 445, 445, 445, 445, 445, 433, 433, 445, 445, 433, 433, 433,
-    433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 431, 432, 431,
-    432, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 445, 445, 26, 26,
-    26, 26, 26, 26, 26, 451, 452, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 433,
-    26, 26, 26, 26, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 433, 433, 433,
-    433, 433, 433, 433, 433, 433, 26, 26, 26, 26, 433, 433, 26, 26, 26, 26,
-    26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64,
-    36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-    33, 33, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
-    453, 446, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-    30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30,
-    30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26,
-    26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26,
-    26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26,
-    26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30,
-    30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30,
-    30, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30,
-    30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 26, 26, 26,
-    26, 26, 30, 26, 26, 431, 432, 431, 432, 431, 432, 431, 432, 431, 432,
-    431, 432, 431, 432, 36, 36, 446, 446, 446, 446, 446, 446, 446, 446, 446,
-    446, 446, 446, 26, 26, 26, 26, 445, 433, 433, 445, 445, 431, 432, 433,
-    445, 445, 433, 445, 445, 445, 433, 433, 433, 433, 433, 445, 445, 445,
-    445, 433, 433, 433, 433, 433, 445, 445, 445, 433, 433, 433, 445, 445,
-    445, 445, 9, 10, 9, 10, 9, 10, 9, 10, 431, 432, 454, 454, 454, 454, 454,
-    454, 454, 454, 433, 433, 433, 431, 432, 9, 10, 431, 432, 431, 432, 431,
-    432, 431, 432, 431, 432, 433, 433, 445, 445, 445, 445, 445, 445, 433,
-    433, 433, 433, 433, 433, 433, 433, 445, 433, 433, 433, 433, 445, 445,
-    445, 445, 445, 433, 445, 445, 433, 433, 431, 432, 431, 432, 445, 433,
-    433, 433, 433, 445, 433, 445, 445, 445, 433, 433, 445, 445, 433, 433,
-    433, 433, 433, 433, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
-    433, 433, 431, 432, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
-    445, 445, 445, 445, 445, 433, 445, 445, 445, 445, 433, 433, 445, 433,
-    445, 433, 433, 445, 433, 445, 445, 445, 445, 433, 433, 433, 433, 433,
-    445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 433, 445, 445, 433,
-    433, 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, 445,
-    445, 445, 445, 445, 433, 433, 445, 445, 445, 445, 445, 445, 445, 445,
-    433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 433, 433, 433,
-    445, 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 433, 433,
-    433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 445, 433, 433,
-    433, 433, 433, 433, 433, 26, 26, 433, 433, 433, 433, 433, 433, 26, 26,
-    26, 26, 26, 26, 26, 26, 30, 30, 30, 26, 26, 26, 26, 64, 64, 26, 26, 26,
-    26, 26, 26, 26, 26, 64, 64, 26, 26, 64, 64, 64, 26, 26, 26, 26, 64, 26,
-    26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 26,
-    26, 26, 26, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
-    455, 455, 455, 64, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456,
-    456, 456, 456, 456, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37,
-    41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44,
-    37, 37, 69, 70, 69, 70, 70, 457, 457, 457, 457, 457, 457, 69, 70, 69, 70,
-    458, 458, 458, 69, 70, 64, 64, 64, 64, 64, 459, 459, 459, 459, 460, 459,
-    459, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461,
-    461, 64, 461, 64, 64, 64, 64, 64, 461, 64, 64, 462, 462, 462, 462, 462,
-    462, 462, 462, 64, 64, 64, 64, 64, 64, 64, 463, 464, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 465, 77, 77, 77, 77, 77, 77, 77, 77,
-    66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66,
-    66, 66, 66, 66, 66, 415, 66, 66, 415, 66, 28, 35, 66, 66, 28, 35, 431,
-    432, 431, 432, 431, 432, 431, 432, 66, 66, 66, 66, 66, 45, 66, 66, 415,
-    415, 66, 66, 66, 66, 415, 66, 418, 64, 64, 64, 64, 64, 466, 466, 466,
-    466, 466, 466, 466, 466, 466, 466, 64, 466, 466, 466, 466, 466, 466, 466,
-    466, 466, 64, 64, 64, 64, 466, 466, 466, 466, 466, 466, 64, 64, 467, 467,
-    467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 64, 64, 64, 64, 468,
-    469, 469, 469, 467, 470, 471, 472, 451, 452, 451, 452, 451, 452, 451,
-    452, 451, 452, 467, 467, 451, 452, 451, 452, 451, 452, 451, 452, 473,
-    474, 475, 475, 467, 472, 472, 472, 472, 472, 472, 472, 472, 472, 476,
-    477, 478, 479, 480, 480, 473, 481, 481, 481, 481, 481, 467, 467, 472,
-    472, 472, 470, 471, 469, 467, 26, 64, 482, 482, 482, 482, 482, 482, 482,
-    482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
-    482, 64, 64, 483, 483, 484, 484, 485, 485, 482, 473, 486, 486, 486, 486,
-    486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486,
-    469, 481, 487, 487, 486, 64, 64, 64, 64, 64, 488, 488, 488, 488, 488,
-    488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 64, 64, 64,
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 64,
-    489, 489, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 489, 489,
-    489, 489, 488, 488, 488, 64, 64, 64, 64, 64, 491, 491, 491, 491, 491,
-    491, 491, 491, 491, 491, 491, 491, 491, 492, 492, 64, 490, 490, 490, 490,
-    490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 493, 493,
-    493, 493, 493, 493, 493, 493, 467, 494, 494, 494, 494, 494, 494, 494,
-    494, 494, 494, 494, 494, 494, 494, 494, 491, 491, 491, 491, 492, 492,
-    492, 489, 489, 494, 494, 494, 494, 494, 494, 494, 489, 489, 489, 489,
-    467, 467, 467, 467, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495,
-    495, 495, 495, 495, 495, 64, 489, 489, 489, 489, 489, 489, 489, 467, 467,
-    467, 467, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 467,
-    467, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
-    496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498,
-    498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 499, 498, 498, 498,
-    498, 498, 498, 498, 64, 64, 64, 500, 500, 500, 500, 500, 500, 500, 500,
-    500, 500, 500, 500, 500, 500, 500, 64, 501, 501, 501, 501, 501, 501, 501,
-    501, 502, 502, 502, 502, 502, 502, 503, 503, 504, 504, 504, 504, 504,
-    504, 504, 504, 504, 504, 504, 504, 505, 506, 506, 506, 507, 507, 507,
-    507, 507, 507, 507, 507, 507, 507, 504, 504, 64, 64, 64, 64, 72, 75, 72,
-    75, 72, 75, 508, 77, 79, 79, 79, 509, 77, 77, 77, 77, 77, 77, 77, 77, 77,
-    77, 509, 510, 72, 75, 72, 75, 403, 403, 77, 77, 511, 511, 511, 511, 511,
-    511, 511, 511, 511, 511, 511, 511, 511, 511, 512, 512, 512, 512, 512,
-    512, 512, 512, 512, 512, 513, 513, 514, 514, 514, 514, 514, 514, 47, 47,
-    47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41,
-    37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41,
-    41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 515, 515, 37, 41, 37, 41, 42,
-    37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 37, 37, 37, 64, 64, 37, 37,
-    37, 37, 37, 41, 37, 41, 64, 64, 64, 64, 64, 64, 64, 42, 44, 44, 41, 42,
-    42, 42, 42, 42, 516, 516, 517, 516, 516, 516, 518, 516, 516, 516, 516,
-    517, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516,
-    516, 516, 519, 519, 517, 517, 519, 520, 520, 520, 520, 64, 64, 64, 64,
-    521, 521, 521, 521, 521, 521, 277, 277, 250, 444, 64, 64, 64, 64, 64, 64,
-    522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523,
-    523, 523, 524, 524, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525,
-    525, 525, 525, 525, 525, 525, 525, 525, 524, 524, 524, 524, 524, 524,
-    524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 526, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528,
-    528, 528, 64, 64, 64, 64, 64, 64, 174, 174, 174, 174, 174, 174, 174, 174,
-    174, 174, 171, 171, 171, 171, 171, 171, 176, 176, 176, 171, 176, 171, 64,
-    64, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 530, 530, 530, 530,
-    530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530,
-    530, 530, 531, 531, 531, 531, 531, 532, 532, 532, 84, 533, 534, 534, 534,
-    534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 535,
-    535, 535, 535, 535, 535, 535, 535, 535, 535, 536, 537, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 538, 290, 290, 290, 290, 290, 64, 64, 64,
-    539, 539, 539, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541,
-    541, 541, 541, 541, 541, 542, 540, 540, 539, 539, 539, 539, 540, 540,
-    539, 540, 540, 540, 543, 544, 544, 544, 544, 544, 544, 544, 544, 544,
-    544, 544, 544, 544, 64, 46, 545, 545, 545, 545, 545, 545, 545, 545, 545,
-    545, 64, 64, 64, 64, 544, 544, 278, 278, 278, 278, 278, 280, 546, 278,
-    283, 283, 278, 278, 278, 278, 278, 64, 547, 547, 547, 547, 547, 547, 547,
-    547, 547, 548, 548, 548, 548, 548, 548, 549, 549, 548, 548, 549, 549,
-    548, 548, 64, 547, 547, 547, 548, 547, 547, 547, 547, 547, 547, 547, 547,
-    548, 549, 64, 64, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 64,
-    64, 551, 551, 551, 551, 546, 278, 278, 278, 278, 278, 278, 286, 286, 286,
-    278, 279, 280, 279, 278, 278, 552, 552, 552, 552, 552, 552, 552, 552,
-    553, 552, 553, 553, 554, 552, 552, 553, 553, 552, 552, 552, 552, 552,
-    553, 553, 552, 553, 552, 64, 64, 64, 64, 64, 64, 64, 64, 552, 552, 555,
-    556, 556, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558,
-    559, 559, 558, 558, 560, 560, 557, 561, 561, 558, 562, 64, 64, 292, 292,
-    292, 292, 292, 292, 64, 41, 41, 41, 515, 44, 44, 44, 44, 41, 41, 41, 41,
-    41, 62, 64, 64, 298, 298, 298, 298, 298, 298, 298, 298, 557, 557, 557,
-    558, 558, 559, 558, 558, 559, 558, 558, 560, 558, 562, 64, 64, 563, 563,
-    563, 563, 563, 563, 563, 563, 563, 563, 64, 64, 64, 64, 64, 64, 290, 290,
-    290, 290, 64, 64, 64, 64, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64,
-    64, 291, 291, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64, 64, 564,
-    564, 564, 564, 564, 564, 564, 564, 565, 565, 565, 565, 565, 565, 565,
-    565, 496, 496, 497, 497, 497, 497, 497, 497, 41, 41, 41, 41, 41, 41, 41,
-    64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 110, 566, 110,
-    110, 567, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
-    110, 64, 110, 110, 110, 110, 110, 64, 110, 64, 110, 110, 64, 110, 110,
-    64, 110, 110, 126, 126, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
-    568, 568, 568, 568, 568, 568, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 569, 418, 64, 64, 126,
-    126, 126, 126, 126, 126, 126, 126, 126, 126, 116, 119, 64, 64, 58, 58,
-    58, 58, 58, 58, 58, 58, 469, 469, 469, 469, 469, 469, 469, 474, 475, 469,
-    64, 64, 64, 64, 64, 64, 78, 78, 78, 78, 78, 78, 78, 136, 136, 136, 136,
-    136, 136, 136, 77, 77, 469, 473, 473, 570, 570, 474, 475, 474, 475, 474,
-    475, 474, 475, 474, 475, 474, 475, 474, 475, 474, 475, 469, 469, 474,
-    475, 469, 469, 469, 469, 570, 570, 570, 571, 469, 571, 64, 469, 571, 469,
-    469, 473, 451, 452, 451, 452, 451, 452, 572, 469, 469, 573, 574, 575,
-    575, 576, 64, 469, 577, 572, 469, 64, 64, 64, 64, 126, 126, 126, 126,
-    126, 64, 126, 126, 126, 126, 126, 126, 126, 64, 64, 410, 64, 578, 578,
-    579, 580, 579, 578, 578, 581, 582, 578, 583, 584, 585, 584, 584, 586,
-    586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 578, 587, 588, 587,
-    578, 578, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
-    589, 589, 589, 589, 589, 589, 581, 578, 582, 590, 591, 590, 592, 592,
-    592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592,
-    592, 592, 581, 588, 582, 588, 581, 582, 593, 594, 595, 593, 593, 596,
-    596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 596, 596, 596,
-    596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 597, 598, 598, 598,
-    598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 64, 64, 64,
-    598, 598, 598, 598, 598, 598, 64, 64, 598, 598, 598, 64, 64, 64, 580,
-    580, 588, 590, 599, 580, 580, 64, 600, 601, 601, 601, 601, 600, 600, 64,
-    64, 602, 602, 602, 26, 30, 64, 64, 603, 603, 603, 603, 603, 603, 603,
-    603, 603, 603, 603, 603, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603,
-    603, 64, 603, 603, 603, 64, 603, 603, 64, 603, 603, 603, 603, 603, 603,
-    603, 64, 64, 603, 603, 603, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64,
-    64, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64,
-    64, 64, 277, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604,
-    604, 605, 605, 605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606,
-    606, 606, 606, 606, 606, 606, 606, 606, 605, 605, 606, 64, 64, 64, 26,
-    26, 26, 26, 64, 64, 64, 64, 606, 64, 64, 64, 64, 64, 64, 64, 277, 277,
-    277, 277, 277, 136, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607,
-    607, 607, 607, 607, 64, 64, 64, 608, 608, 608, 608, 608, 608, 608, 608,
-    608, 64, 64, 64, 64, 64, 64, 64, 136, 438, 438, 438, 438, 438, 438, 438,
-    438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 64, 64, 64,
-    64, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, 610, 610, 64, 64,
-    64, 64, 611, 611, 611, 611, 611, 611, 611, 611, 611, 612, 611, 611, 611,
-    611, 611, 611, 611, 611, 612, 64, 64, 64, 64, 64, 613, 613, 613, 613,
-    613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 614, 614, 614, 614,
-    614, 64, 64, 64, 64, 64, 615, 615, 615, 615, 615, 615, 615, 615, 615,
-    615, 615, 615, 615, 615, 64, 616, 617, 617, 617, 617, 617, 617, 617, 617,
-    617, 617, 617, 617, 64, 64, 64, 64, 618, 619, 619, 619, 619, 619, 64, 64,
-    620, 620, 620, 620, 620, 620, 620, 620, 621, 621, 621, 621, 621, 621,
-    621, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623,
-    623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 64, 64, 624, 624, 624,
-    624, 624, 624, 624, 624, 624, 624, 64, 64, 64, 64, 64, 64, 625, 625, 625,
-    625, 625, 625, 625, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626,
-    626, 626, 626, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 627, 628, 628,
-    628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 64, 628,
-    628, 628, 628, 628, 628, 64, 64, 629, 629, 629, 629, 629, 629, 64, 64,
-    629, 64, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
-    629, 629, 629, 629, 629, 629, 629, 64, 629, 629, 64, 64, 64, 629, 64, 64,
-    629, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630,
-    630, 64, 631, 632, 632, 632, 632, 632, 632, 632, 632, 633, 633, 633, 633,
-    633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 634, 635,
-    635, 635, 635, 635, 635, 635, 636, 636, 636, 636, 636, 636, 636, 636,
-    636, 636, 636, 636, 636, 636, 636, 64, 64, 64, 64, 64, 64, 64, 64, 637,
-    637, 637, 637, 637, 637, 637, 637, 637, 638, 638, 638, 638, 638, 638,
-    638, 638, 638, 638, 638, 64, 638, 638, 64, 64, 64, 64, 64, 639, 639, 639,
-    639, 639, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
-    640, 640, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 643, 643, 643,
-    643, 643, 643, 643, 643, 643, 643, 64, 64, 64, 64, 64, 644, 645, 645,
-    645, 645, 645, 645, 645, 645, 646, 646, 646, 646, 646, 646, 646, 646, 64,
-    64, 64, 64, 647, 647, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647,
-    64, 64, 647, 647, 647, 647, 647, 647, 648, 649, 649, 649, 64, 649, 649,
-    64, 64, 64, 64, 64, 649, 650, 649, 651, 648, 648, 648, 648, 64, 648, 648,
-    648, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648,
-    648, 648, 648, 648, 648, 648, 64, 64, 64, 64, 651, 652, 650, 64, 64, 64,
-    64, 653, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655,
-    655, 655, 655, 655, 64, 64, 64, 64, 64, 64, 64, 656, 656, 656, 656, 656,
-    656, 656, 656, 656, 656, 656, 656, 656, 657, 657, 658, 659, 659, 659,
-    659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 660, 660, 660, 661,
-    661, 661, 661, 661, 661, 661, 661, 662, 661, 661, 661, 661, 661, 661,
-    661, 661, 661, 661, 661, 661, 663, 664, 64, 64, 64, 64, 665, 665, 665,
-    665, 665, 666, 666, 666, 666, 666, 666, 666, 64, 667, 667, 667, 667, 667,
-    667, 667, 667, 667, 667, 667, 667, 667, 667, 64, 64, 64, 668, 668, 668,
-    668, 668, 668, 668, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
-    669, 669, 669, 669, 64, 64, 670, 670, 670, 670, 670, 670, 670, 670, 671,
-    671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 64, 64, 64, 64, 64,
-    672, 672, 672, 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, 673,
-    673, 673, 673, 673, 64, 64, 64, 64, 64, 64, 64, 674, 674, 674, 674, 64,
-    64, 64, 64, 675, 675, 675, 675, 675, 675, 675, 676, 676, 676, 676, 676,
-    676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677,
-    677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 678, 678, 678, 678,
-    678, 678, 678, 678, 678, 678, 678, 64, 64, 64, 64, 64, 64, 64, 679, 679,
-    679, 679, 679, 679, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680,
-    680, 680, 680, 680, 680, 64, 681, 682, 681, 683, 683, 683, 683, 683, 683,
-    683, 683, 683, 683, 683, 683, 683, 682, 682, 682, 682, 682, 682, 682,
-    682, 682, 682, 682, 682, 682, 682, 684, 685, 685, 685, 685, 685, 685,
-    685, 64, 64, 64, 64, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
-    686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 687, 687, 687, 687,
-    687, 687, 687, 687, 687, 687, 64, 64, 64, 64, 64, 64, 64, 684, 688, 688,
-    689, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
-    689, 689, 689, 688, 688, 688, 688, 689, 689, 691, 692, 693, 693, 694,
-    693, 693, 693, 693, 64, 64, 64, 64, 64, 64, 695, 695, 695, 695, 695, 695,
-    695, 695, 695, 64, 64, 64, 64, 64, 64, 64, 696, 696, 696, 696, 696, 696,
-    696, 696, 696, 696, 64, 64, 64, 64, 64, 64, 697, 697, 697, 698, 698, 698,
-    698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698,
-    698, 698, 698, 699, 699, 699, 699, 699, 700, 699, 699, 699, 699, 699,
-    699, 701, 701, 64, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 703,
-    703, 703, 703, 64, 64, 64, 64, 704, 704, 704, 704, 704, 704, 704, 704,
-    704, 704, 704, 705, 706, 706, 704, 64, 707, 707, 708, 709, 709, 709, 709,
-    709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 708, 708,
-    708, 707, 707, 707, 707, 707, 707, 707, 707, 707, 708, 710, 709, 709,
-    709, 709, 711, 711, 711, 711, 711, 712, 707, 707, 711, 64, 64, 713, 713,
-    713, 713, 713, 713, 713, 713, 713, 713, 709, 711, 709, 711, 711, 711, 64,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8,
+    9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22,
+    22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 25, 24, 10, 15, 26, 26, 26,
+    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 27, 17,
+    28, 29, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+    30, 30, 30, 16, 31, 32, 25, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 13,
+    37, 13, 38, 39, 40, 41, 42, 43, 25, 44, 45, 28, 46, 47, 48, 48, 49, 50,
+    39, 39, 40, 48, 42, 51, 52, 52, 52, 35, 53, 53, 53, 53, 53, 53, 54, 53,
+    53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 55, 54, 53,
+    53, 53, 53, 53, 54, 56, 56, 56, 57, 57, 57, 57, 56, 57, 56, 56, 56, 57,
+    56, 56, 57, 57, 56, 57, 56, 56, 57, 57, 57, 55, 56, 56, 56, 57, 56, 57,
+    56, 57, 53, 56, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57,
+    53, 56, 53, 56, 53, 57, 53, 57, 53, 57, 53, 56, 53, 57, 53, 57, 53, 57,
+    53, 57, 53, 57, 54, 56, 53, 56, 54, 56, 53, 57, 53, 57, 56, 53, 57, 53,
+    57, 53, 57, 54, 56, 54, 56, 53, 56, 53, 57, 53, 56, 56, 54, 56, 53, 56,
+    53, 57, 53, 57, 54, 56, 53, 57, 53, 57, 53, 53, 57, 53, 57, 53, 57, 57,
+    57, 53, 53, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 57, 53, 53, 53, 53,
+    57, 53, 53, 57, 53, 53, 53, 57, 57, 57, 53, 53, 57, 53, 53, 57, 53, 57,
+    53, 57, 53, 53, 57, 53, 57, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 53,
+    57, 53, 53, 57, 57, 58, 53, 57, 57, 57, 58, 58, 58, 58, 53, 59, 57, 53,
+    59, 57, 53, 59, 57, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53,
+    56, 53, 56, 57, 53, 57, 57, 53, 59, 57, 53, 57, 53, 53, 53, 57, 53, 57,
+    57, 57, 57, 57, 57, 57, 53, 53, 57, 53, 53, 57, 57, 53, 57, 53, 53, 53,
+    53, 57, 57, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+    57, 57, 57, 57, 58, 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61,
+    61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 64, 63, 61, 65, 66, 65, 65, 65,
+    66, 65, 61, 61, 67, 62, 63, 63, 63, 63, 63, 63, 40, 40, 40, 40, 63, 40,
+    63, 49, 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, 68, 68, 61, 63, 62, 63,
+    63, 63, 63, 63, 63, 63, 63, 63, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+    69, 69, 69, 70, 71, 71, 71, 71, 70, 72, 71, 71, 71, 71, 71, 73, 73, 71,
+    71, 71, 71, 73, 73, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 74, 74,
+    74, 74, 74, 71, 71, 71, 71, 69, 69, 69, 69, 69, 69, 69, 69, 75, 69, 71,
+    71, 71, 69, 69, 69, 71, 71, 76, 69, 69, 69, 71, 71, 71, 71, 69, 70, 71,
+    71, 69, 77, 78, 78, 77, 78, 78, 77, 69, 69, 69, 69, 69, 79, 80, 79, 80,
+    61, 81, 79, 80, 82, 82, 83, 80, 80, 80, 84, 79, 82, 82, 82, 82, 81, 63,
+    79, 85, 79, 79, 79, 82, 79, 82, 79, 79, 80, 86, 86, 86, 86, 86, 86, 86,
+    86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 82, 86, 86, 86, 86, 86, 86, 86,
+    79, 79, 80, 80, 80, 80, 80, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+    87, 87, 87, 87, 87, 87, 80, 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, 80,
+    80, 79, 80, 80, 79, 79, 79, 80, 80, 80, 79, 80, 79, 80, 79, 80, 79, 80,
+    79, 80, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 80, 80,
+    80, 80, 79, 80, 90, 79, 80, 79, 79, 80, 80, 79, 79, 79, 91, 92, 91, 91,
+    91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92,
+    92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 94, 94, 94, 94, 94, 94,
+    94, 94, 94, 94, 94, 94, 94, 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94,
+    95, 96, 96, 97, 97, 96, 98, 98, 91, 94, 91, 94, 91, 94, 91, 91, 94, 91,
+    94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, 94, 82, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 82,
+    82, 100, 101, 101, 101, 101, 101, 101, 82, 102, 102, 102, 102, 102, 102,
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 82, 103, 104, 82, 82, 105,
+    105, 106, 82, 107, 108, 108, 108, 108, 107, 108, 108, 108, 109, 107, 108,
+    108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 108, 108, 107,
+    108, 108, 109, 110, 108, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+    120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 126, 108, 107, 129,
+    119, 82, 82, 82, 82, 82, 82, 82, 82, 130, 130, 130, 130, 130, 130, 130,
+    130, 130, 130, 130, 82, 82, 82, 82, 82, 130, 130, 130, 126, 126, 82, 82,
+    82, 131, 131, 131, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138,
+    139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 142, 143, 144,
+    145, 82, 146, 144, 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 147, 149, 150, 151, 152, 153, 154,
+    155, 156, 97, 97, 157, 158, 140, 140, 140, 140, 140, 158, 140, 140, 158,
+    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 135, 160, 160, 161,
+    147, 147, 162, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+    146, 147, 140, 140, 140, 140, 140, 140, 140, 132, 139, 140, 140, 140,
+    140, 158, 140, 163, 163, 140, 140, 139, 158, 140, 140, 158, 147, 147,
+    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 147, 147, 147, 165,
+    165, 147, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+    166, 166, 82, 167, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+    168, 168, 168, 168, 168, 170, 171, 170, 170, 171, 170, 170, 171, 171,
+    171, 170, 171, 171, 170, 171, 170, 170, 170, 171, 170, 171, 170, 171,
+    170, 171, 170, 170, 82, 82, 168, 168, 168, 172, 172, 172, 172, 172, 172,
+    172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+    173, 173, 173, 173, 173, 172, 82, 82, 82, 82, 82, 82, 174, 174, 174, 174,
+    174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
+    175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+    176, 176, 177, 176, 178, 178, 179, 180, 181, 182, 178, 82, 82, 82, 82,
+    82, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+    184, 184, 184, 184, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+    185, 184, 184, 184, 185, 184, 184, 184, 184, 184, 82, 82, 186, 186, 186,
+    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 82, 187, 187,
+    187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 82, 82, 189, 82, 147,
+    147, 147, 147, 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 82, 82,
+    82, 82, 82, 82, 140, 140, 140, 140, 140, 140, 132, 158, 140, 140, 158,
+    140, 140, 158, 140, 140, 140, 158, 158, 158, 190, 191, 192, 140, 140,
+    140, 158, 140, 140, 158, 158, 140, 140, 140, 140, 140, 193, 193, 193,
+    194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+    195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 193, 193,
+    193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 97, 157, 198, 198, 193,
+    193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 200, 200,
+    200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 203, 204,
+    205, 205, 82, 203, 203, 203, 203, 203, 203, 203, 203, 82, 82, 203, 203,
+    82, 82, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+    203, 82, 203, 203, 203, 203, 203, 203, 203, 82, 203, 82, 82, 82, 203,
+    203, 203, 203, 82, 82, 206, 203, 205, 205, 205, 204, 204, 204, 204, 82,
+    82, 205, 205, 82, 82, 205, 205, 207, 203, 82, 82, 82, 82, 82, 82, 82, 82,
+    205, 82, 82, 82, 82, 203, 203, 82, 203, 203, 203, 204, 204, 82, 82, 208,
+    208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 209, 210,
+    210, 210, 210, 210, 211, 212, 213, 82, 82, 82, 82, 82, 214, 214, 215, 82,
+    216, 216, 216, 216, 216, 216, 82, 82, 82, 82, 216, 216, 82, 82, 216, 216,
+    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 82, 216, 216,
+    216, 216, 216, 216, 216, 82, 216, 216, 82, 216, 216, 82, 216, 216, 82,
+    82, 217, 82, 215, 215, 215, 214, 214, 82, 82, 82, 82, 214, 214, 82, 82,
+    214, 214, 218, 82, 82, 82, 214, 82, 82, 82, 82, 82, 82, 82, 216, 216,
+    216, 216, 82, 216, 82, 82, 82, 82, 82, 82, 82, 219, 219, 219, 219, 219,
+    219, 219, 219, 219, 219, 214, 214, 216, 216, 216, 214, 82, 82, 82, 220,
+    220, 221, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222,
+    222, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+    222, 82, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 82, 222, 222,
+    222, 222, 222, 82, 82, 223, 222, 221, 221, 221, 220, 220, 220, 220, 220,
+    82, 220, 220, 221, 82, 221, 221, 224, 82, 82, 222, 82, 82, 82, 82, 82,
+    82, 82, 222, 222, 220, 220, 82, 82, 225, 225, 225, 225, 225, 225, 225,
+    225, 225, 225, 226, 227, 82, 82, 82, 82, 82, 82, 82, 222, 82, 82, 82, 82,
+    82, 82, 82, 228, 229, 229, 82, 230, 230, 230, 230, 230, 230, 230, 230,
+    82, 82, 230, 230, 82, 82, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+    230, 230, 230, 230, 230, 82, 230, 230, 230, 230, 230, 230, 230, 82, 230,
+    230, 82, 230, 230, 230, 230, 230, 82, 82, 231, 230, 229, 228, 229, 228,
+    228, 228, 228, 82, 82, 229, 229, 82, 82, 229, 229, 232, 82, 82, 82, 82,
+    82, 82, 82, 82, 228, 229, 82, 82, 82, 82, 230, 230, 82, 230, 230, 230,
+    228, 228, 82, 82, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234,
+    230, 235, 235, 235, 235, 235, 235, 82, 82, 236, 237, 82, 237, 237, 237,
+    237, 237, 237, 82, 82, 82, 237, 237, 237, 82, 237, 237, 237, 237, 82, 82,
+    82, 237, 237, 82, 237, 82, 237, 237, 82, 82, 82, 237, 237, 82, 82, 82,
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 82, 82, 82, 82, 238,
+    238, 236, 238, 238, 82, 82, 82, 238, 238, 238, 82, 238, 238, 238, 239,
+    82, 82, 237, 82, 82, 82, 82, 82, 82, 238, 82, 82, 82, 82, 82, 82, 240,
+    240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 242, 242,
+    242, 242, 242, 242, 243, 242, 82, 82, 82, 82, 82, 244, 245, 245, 245, 82,
+    246, 246, 246, 246, 246, 246, 246, 246, 82, 246, 246, 246, 82, 246, 246,
+    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 82,
+    82, 82, 246, 244, 244, 244, 245, 245, 245, 245, 82, 244, 244, 244, 82,
+    244, 244, 244, 247, 82, 82, 82, 82, 82, 82, 82, 248, 249, 82, 246, 246,
+    246, 82, 82, 82, 82, 82, 246, 246, 244, 244, 82, 82, 250, 250, 250, 250,
+    250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 252,
+    253, 254, 255, 255, 82, 253, 253, 253, 253, 253, 253, 253, 253, 82, 253,
+    253, 253, 82, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+    253, 253, 253, 253, 253, 253, 82, 253, 253, 253, 253, 253, 82, 82, 256,
+    253, 255, 257, 255, 255, 255, 255, 255, 82, 257, 255, 255, 82, 255, 255,
+    254, 258, 82, 82, 82, 82, 82, 82, 82, 255, 255, 82, 82, 82, 82, 82, 82,
+    82, 253, 82, 253, 253, 254, 254, 82, 82, 259, 259, 259, 259, 259, 259,
+    259, 259, 259, 259, 82, 253, 253, 82, 82, 82, 82, 82, 82, 260, 261, 261,
+    82, 262, 262, 262, 262, 262, 262, 262, 262, 82, 262, 262, 262, 82, 262,
+    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+    262, 262, 82, 82, 262, 261, 261, 261, 260, 260, 260, 260, 82, 261, 261,
+    261, 82, 261, 261, 261, 263, 262, 264, 82, 82, 82, 82, 262, 262, 262,
+    261, 265, 265, 265, 265, 265, 265, 265, 262, 262, 262, 260, 260, 82, 82,
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265,
+    265, 265, 265, 265, 265, 267, 262, 262, 262, 262, 262, 262, 82, 82, 268,
+    268, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+    269, 269, 269, 269, 269, 82, 82, 82, 269, 269, 269, 269, 269, 269, 269,
+    269, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 82, 269, 82, 82,
+    82, 82, 270, 82, 82, 82, 82, 268, 268, 268, 271, 271, 271, 82, 271, 82,
+    268, 268, 268, 268, 268, 268, 268, 268, 82, 82, 82, 82, 82, 82, 272, 272,
+    272, 272, 272, 272, 272, 272, 272, 272, 82, 82, 268, 268, 273, 82, 82,
+    82, 82, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+    274, 274, 274, 275, 274, 274, 275, 275, 275, 275, 276, 276, 277, 82, 82,
+    82, 82, 278, 274, 274, 274, 274, 274, 274, 279, 275, 280, 280, 280, 280,
+    275, 275, 275, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+    283, 283, 82, 82, 82, 82, 82, 284, 284, 82, 284, 82, 82, 284, 284, 82,
+    284, 82, 82, 284, 82, 82, 82, 82, 82, 82, 284, 284, 284, 284, 82, 284,
+    284, 284, 284, 284, 284, 284, 82, 284, 284, 284, 82, 284, 82, 284, 82,
+    82, 284, 284, 82, 284, 284, 284, 284, 285, 284, 284, 285, 285, 285, 285,
+    286, 286, 82, 285, 285, 284, 82, 82, 284, 284, 284, 284, 284, 82, 287,
+    82, 288, 288, 288, 288, 285, 285, 82, 82, 289, 289, 289, 289, 289, 289,
+    289, 289, 289, 289, 82, 82, 284, 284, 284, 284, 290, 291, 291, 291, 292,
+    293, 292, 292, 294, 292, 292, 295, 294, 296, 296, 296, 296, 296, 294,
+    297, 296, 297, 297, 297, 298, 298, 297, 297, 297, 297, 297, 297, 299,
+    299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 300,
+    300, 300, 300, 300, 300, 301, 298, 297, 298, 297, 302, 303, 304, 303,
+    304, 305, 305, 290, 290, 290, 290, 290, 290, 290, 290, 82, 290, 290, 290,
+    290, 290, 290, 290, 290, 290, 290, 290, 290, 82, 82, 82, 82, 306, 307,
+    308, 309, 308, 308, 308, 308, 308, 307, 307, 307, 307, 308, 310, 307,
+    308, 311, 311, 312, 295, 311, 311, 290, 290, 290, 290, 290, 308, 308,
+    308, 308, 308, 308, 308, 308, 308, 308, 308, 82, 308, 308, 308, 308, 308,
+    308, 308, 308, 308, 308, 308, 308, 82, 301, 301, 297, 297, 297, 297, 297,
+    297, 298, 297, 297, 297, 297, 297, 297, 82, 297, 297, 292, 292, 295, 292,
+    293, 313, 313, 313, 313, 294, 294, 82, 82, 82, 82, 82, 314, 314, 314,
+    314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 316, 316,
+    315, 316, 316, 316, 316, 316, 317, 315, 318, 318, 315, 315, 316, 316,
+    314, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 320, 320, 321,
+    321, 321, 321, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 314,
+    314, 314, 314, 316, 316, 316, 314, 315, 315, 315, 314, 314, 315, 315,
+    315, 315, 315, 315, 315, 314, 314, 314, 316, 316, 316, 316, 314, 314,
+    314, 314, 314, 316, 315, 315, 316, 316, 315, 315, 315, 315, 315, 315,
+    322, 314, 315, 319, 319, 315, 315, 315, 316, 323, 323, 324, 324, 324,
+    324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 82, 324, 82, 82,
+    82, 82, 82, 324, 82, 82, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+    325, 325, 326, 327, 325, 325, 325, 328, 328, 328, 328, 328, 328, 328,
+    328, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330,
+    330, 330, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331,
+    331, 331, 82, 82, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 331,
+    82, 82, 332, 332, 332, 333, 334, 333, 333, 333, 333, 333, 333, 333, 335,
+    335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335,
+    335, 335, 335, 335, 335, 82, 82, 82, 336, 336, 336, 336, 336, 336, 336,
+    336, 336, 336, 82, 82, 82, 82, 82, 82, 337, 337, 337, 337, 337, 337, 337,
+    337, 337, 337, 337, 337, 337, 337, 82, 82, 338, 338, 338, 338, 338, 338,
+    82, 82, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+    340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 340, 342, 343, 343,
+    343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+    343, 343, 344, 345, 82, 82, 82, 346, 346, 346, 346, 346, 346, 346, 346,
+    346, 346, 346, 199, 199, 199, 347, 347, 347, 346, 346, 346, 346, 346,
+    346, 346, 346, 82, 82, 82, 82, 82, 82, 82, 348, 348, 348, 348, 348, 348,
+    348, 348, 348, 348, 348, 348, 348, 82, 348, 348, 348, 348, 349, 349, 350,
+    82, 82, 82, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352,
+    353, 199, 199, 82, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355,
+    355, 82, 82, 82, 82, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+    356, 356, 356, 82, 356, 356, 356, 82, 357, 357, 82, 82, 82, 82, 358, 358,
+    358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 360, 359,
+    359, 359, 359, 359, 359, 359, 360, 360, 360, 360, 360, 360, 360, 360,
+    359, 360, 360, 359, 359, 359, 359, 359, 359, 359, 359, 359, 361, 359,
+    362, 362, 363, 364, 362, 365, 362, 366, 358, 367, 82, 82, 368, 368, 368,
+    368, 368, 368, 368, 368, 368, 368, 82, 82, 82, 82, 82, 82, 369, 369, 369,
+    369, 369, 369, 369, 369, 369, 369, 82, 82, 82, 82, 82, 82, 370, 370, 371,
+    371, 372, 373, 374, 370, 375, 375, 370, 376, 376, 376, 377, 82, 378, 378,
+    378, 378, 378, 378, 378, 378, 378, 378, 82, 82, 82, 82, 82, 82, 379, 379,
+    379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 379, 379,
+    379, 379, 379, 379, 379, 376, 376, 379, 379, 381, 379, 82, 82, 82, 82,
+    82, 340, 340, 340, 340, 340, 340, 82, 82, 382, 382, 382, 382, 382, 382,
+    382, 382, 382, 382, 382, 382, 382, 382, 382, 82, 383, 383, 383, 384, 384,
+    384, 384, 383, 383, 384, 384, 384, 82, 82, 82, 82, 384, 384, 383, 384,
+    384, 384, 384, 384, 384, 385, 386, 387, 82, 82, 82, 82, 388, 82, 82, 82,
+    389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391,
+    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 82, 82, 391,
+    391, 391, 391, 391, 82, 82, 82, 392, 392, 392, 392, 392, 392, 392, 392,
+    392, 392, 392, 392, 82, 82, 82, 82, 392, 392, 82, 82, 82, 82, 82, 82,
+    393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 82, 82, 82, 395,
+    395, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397,
+    397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 400,
+    401, 82, 82, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403,
+    403, 403, 403, 404, 405, 404, 405, 405, 405, 405, 405, 405, 405, 82, 406,
+    404, 405, 404, 404, 405, 405, 405, 405, 405, 405, 405, 405, 404, 404,
+    404, 404, 404, 404, 405, 405, 407, 407, 407, 407, 407, 407, 407, 407, 82,
+    82, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 82, 82, 82,
+    82, 82, 82, 410, 410, 410, 410, 410, 410, 410, 411, 410, 410, 410, 410,
+    410, 410, 82, 82, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, 97,
+    97, 157, 412, 82, 413, 413, 413, 413, 414, 415, 415, 415, 415, 415, 415,
+    415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 414, 413, 413, 413,
+    413, 413, 414, 413, 414, 414, 414, 414, 414, 413, 414, 417, 415, 415,
+    415, 415, 415, 415, 415, 82, 82, 82, 82, 418, 418, 418, 418, 418, 418,
+    418, 418, 418, 418, 419, 419, 420, 419, 419, 419, 419, 421, 421, 421,
+    421, 421, 421, 421, 421, 421, 421, 422, 423, 422, 422, 422, 422, 422,
+    422, 422, 421, 421, 421, 421, 421, 421, 421, 421, 421, 82, 82, 82, 424,
+    424, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+    426, 426, 425, 424, 424, 424, 424, 425, 425, 424, 424, 427, 428, 424,
+    424, 426, 426, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 426,
+    426, 426, 426, 426, 426, 430, 430, 430, 430, 430, 430, 430, 430, 430,
+    430, 430, 430, 430, 430, 431, 432, 433, 433, 432, 432, 432, 433, 432,
+    433, 433, 433, 434, 434, 82, 82, 82, 82, 82, 82, 82, 82, 435, 435, 435,
+    435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437,
+    437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438,
+    438, 437, 437, 438, 439, 82, 82, 82, 440, 440, 440, 440, 440, 441, 441,
+    441, 441, 441, 441, 441, 441, 441, 441, 82, 82, 82, 436, 436, 436, 442,
+    442, 442, 442, 442, 442, 442, 442, 442, 442, 443, 443, 443, 443, 443,
+    443, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, 444,
+    444, 445, 445, 94, 82, 82, 82, 82, 82, 82, 82, 446, 446, 446, 446, 446,
+    446, 446, 446, 97, 97, 97, 326, 447, 157, 157, 157, 157, 157, 97, 97,
+    157, 157, 157, 157, 97, 448, 447, 447, 447, 447, 447, 447, 447, 449, 449,
+    449, 449, 157, 449, 449, 449, 449, 448, 448, 97, 449, 449, 82, 97, 97,
+    82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 80, 80, 80, 80, 80, 94,
+    60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 83, 83, 83, 83, 60, 60, 60, 60,
+    83, 83, 83, 83, 83, 57, 57, 57, 57, 57, 450, 57, 57, 57, 57, 57, 57, 57,
+    57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 97, 97,
+    157, 97, 97, 97, 97, 97, 97, 97, 157, 97, 97, 451, 452, 157, 453, 97, 97,
+    97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+    97, 82, 82, 82, 82, 82, 97, 454, 157, 97, 157, 53, 57, 53, 57, 53, 57,
+    57, 57, 57, 57, 57, 57, 57, 57, 53, 57, 80, 80, 80, 80, 80, 80, 80, 80,
+    79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 82, 82, 79, 79,
+    79, 79, 79, 79, 82, 82, 82, 79, 82, 79, 82, 79, 82, 79, 455, 455, 455,
+    455, 455, 455, 455, 455, 80, 80, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79,
+    455, 81, 80, 81, 81, 81, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 455, 81,
+    81, 81, 80, 80, 80, 80, 82, 82, 80, 80, 79, 79, 79, 79, 82, 81, 81, 81,
+    79, 79, 79, 79, 79, 81, 81, 81, 82, 82, 80, 80, 80, 82, 80, 80, 79, 79,
+    79, 79, 455, 456, 81, 82, 457, 457, 457, 457, 457, 457, 457, 458, 457,
+    457, 457, 459, 460, 461, 462, 463, 464, 465, 466, 464, 467, 468, 39, 85,
+    469, 470, 471, 472, 469, 470, 471, 472, 39, 39, 473, 85, 474, 474, 474,
+    475, 476, 477, 478, 479, 480, 481, 482, 34, 483, 484, 483, 483, 484, 485,
+    486, 486, 85, 43, 51, 39, 487, 487, 473, 488, 488, 85, 85, 85, 489, 490,
+    491, 487, 487, 487, 85, 85, 85, 85, 85, 85, 85, 85, 492, 85, 488, 85,
+    373, 85, 373, 373, 373, 373, 85, 373, 373, 457, 493, 494, 494, 494, 494,
+    82, 495, 496, 497, 498, 499, 499, 499, 499, 499, 499, 500, 60, 82, 82,
+    48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 502, 500, 48, 48,
+    48, 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 82, 60, 60, 60,
+    60, 60, 82, 82, 82, 278, 278, 278, 278, 278, 278, 278, 503, 278, 504,
+    278, 278, 37, 278, 278, 278, 278, 278, 278, 278, 278, 278, 503, 278, 278,
+    278, 278, 503, 278, 278, 503, 505, 505, 505, 505, 505, 505, 505, 505,
+    505, 97, 97, 447, 447, 97, 97, 97, 97, 447, 447, 447, 97, 97, 412, 412,
+    412, 412, 97, 412, 412, 412, 447, 447, 97, 157, 97, 447, 447, 157, 157,
+    157, 157, 97, 82, 82, 82, 82, 82, 82, 82, 41, 41, 506, 507, 41, 508, 41,
+    506, 41, 507, 50, 506, 506, 506, 50, 50, 506, 506, 506, 509, 41, 506,
+    510, 41, 492, 506, 506, 506, 506, 506, 41, 41, 41, 508, 508, 41, 506, 41,
+    86, 41, 506, 41, 53, 511, 506, 506, 512, 50, 506, 506, 53, 506, 50, 449,
+    449, 449, 449, 50, 41, 41, 50, 50, 506, 506, 513, 492, 492, 492, 492,
+    506, 50, 50, 50, 50, 41, 492, 41, 41, 57, 313, 514, 514, 514, 515, 52,
+    516, 514, 514, 514, 514, 514, 52, 515, 515, 52, 514, 517, 517, 517, 517,
+    517, 517, 517, 517, 517, 517, 517, 517, 518, 518, 518, 518, 517, 517,
+    518, 518, 518, 518, 518, 518, 518, 518, 518, 53, 57, 518, 518, 518, 518,
+    52, 41, 41, 82, 82, 82, 82, 55, 55, 55, 55, 55, 508, 508, 508, 508, 508,
+    492, 492, 41, 41, 41, 41, 492, 41, 41, 492, 41, 41, 492, 41, 41, 41, 41,
+    41, 41, 41, 492, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 45, 41, 41, 41,
+    41, 41, 41, 41, 41, 41, 41, 41, 41, 492, 492, 41, 41, 55, 41, 55, 41, 41,
+    41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, 492, 492, 492, 492,
+    492, 492, 492, 492, 492, 492, 492, 492, 55, 513, 519, 519, 513, 492, 492,
+    55, 519, 513, 513, 519, 513, 513, 492, 55, 492, 519, 520, 521, 492, 519,
+    513, 492, 492, 492, 519, 513, 513, 519, 55, 519, 519, 513, 513, 55, 513,
+    55, 513, 55, 55, 55, 55, 519, 519, 513, 519, 513, 513, 513, 513, 513, 55,
+    55, 55, 55, 492, 513, 492, 513, 519, 519, 513, 513, 513, 513, 513, 513,
+    513, 513, 513, 513, 519, 513, 513, 513, 519, 492, 492, 492, 492, 492,
+    519, 513, 513, 513, 492, 492, 492, 492, 492, 492, 492, 492, 492, 513,
+    519, 55, 513, 492, 519, 519, 519, 519, 513, 513, 519, 519, 492, 492, 519,
+    519, 513, 513, 519, 519, 513, 513, 519, 519, 513, 513, 513, 513, 513,
+    492, 492, 513, 513, 513, 513, 492, 492, 55, 492, 492, 513, 55, 492, 492,
+    492, 492, 492, 492, 492, 492, 513, 513, 492, 55, 513, 513, 513, 492, 492,
+    492, 492, 492, 513, 519, 492, 513, 513, 513, 513, 513, 492, 492, 513,
+    513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+    522, 490, 491, 490, 491, 41, 41, 41, 41, 41, 41, 508, 41, 41, 41, 41, 41,
+    41, 41, 523, 523, 41, 41, 41, 41, 513, 513, 41, 41, 41, 41, 41, 41, 41,
+    524, 525, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 313, 313, 313, 313,
+    313, 313, 313, 313, 313, 313, 313, 313, 313, 41, 492, 41, 41, 41, 41, 41,
+    41, 41, 41, 313, 41, 41, 41, 41, 41, 492, 492, 492, 492, 492, 492, 492,
+    492, 492, 41, 41, 41, 41, 492, 492, 41, 41, 41, 41, 41, 41, 41, 526, 526,
+    526, 526, 41, 41, 41, 523, 527, 527, 523, 41, 41, 41, 41, 41, 41, 41, 41,
+    41, 41, 41, 82, 41, 41, 41, 82, 82, 82, 82, 82, 52, 52, 52, 52, 52, 52,
+    52, 52, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 528, 528, 528,
+    528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 516, 52, 52, 52,
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 515, 508, 508, 508, 508, 508, 508,
+    508, 508, 508, 508, 508, 508, 41, 41, 41, 41, 508, 508, 508, 508, 529,
+    41, 41, 41, 41, 41, 508, 508, 508, 508, 41, 41, 508, 508, 41, 508, 508,
+    508, 508, 508, 508, 508, 41, 41, 41, 41, 41, 41, 41, 41, 508, 508, 41,
+    41, 508, 55, 41, 41, 41, 41, 508, 508, 41, 41, 508, 55, 41, 41, 41, 41,
+    508, 508, 508, 41, 41, 508, 41, 41, 508, 508, 41, 41, 41, 41, 41, 41, 41,
+    508, 492, 492, 492, 492, 492, 530, 530, 492, 527, 527, 527, 527, 41, 508,
+    508, 41, 41, 508, 41, 41, 41, 41, 508, 508, 41, 41, 41, 41, 523, 523,
+    529, 529, 527, 41, 527, 527, 531, 532, 531, 527, 41, 527, 527, 527, 41,
+    41, 41, 41, 508, 41, 508, 41, 41, 41, 41, 41, 526, 526, 526, 526, 526,
+    526, 526, 526, 526, 526, 526, 526, 41, 41, 41, 41, 508, 508, 41, 508,
+    508, 508, 41, 508, 531, 508, 508, 41, 508, 508, 41, 55, 41, 41, 41, 41,
+    41, 41, 41, 523, 41, 41, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+    508, 508, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 526, 526, 313, 41, 41,
+    41, 41, 41, 41, 41, 41, 523, 523, 531, 527, 527, 527, 527, 523, 523, 531,
+    531, 531, 508, 508, 508, 508, 531, 526, 531, 531, 531, 508, 531, 523,
+    508, 508, 508, 531, 531, 508, 508, 531, 508, 508, 531, 531, 531, 41, 508,
+    41, 41, 41, 41, 508, 508, 523, 508, 508, 508, 508, 508, 508, 531, 523,
+    523, 531, 523, 508, 531, 531, 533, 523, 508, 508, 523, 531, 531, 527,
+    527, 527, 527, 527, 526, 41, 41, 527, 527, 534, 534, 532, 532, 41, 41,
+    526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41,
+    41, 41, 526, 41, 526, 41, 41, 41, 41, 526, 526, 526, 41, 535, 41, 41, 41,
+    536, 536, 536, 536, 536, 536, 41, 537, 537, 527, 41, 41, 41, 490, 491,
+    490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 52, 52, 516,
+    516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 41, 526, 526, 526,
+    41, 41, 41, 41, 41, 41, 41, 526, 513, 492, 492, 513, 513, 490, 491, 492,
+    513, 513, 492, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 513,
+    513, 492, 492, 492, 492, 492, 513, 513, 513, 492, 492, 492, 513, 513,
+    513, 513, 16, 32, 16, 32, 16, 32, 16, 32, 490, 491, 538, 538, 538, 538,
+    538, 538, 538, 538, 492, 492, 492, 490, 491, 16, 32, 490, 491, 490, 491,
+    490, 491, 490, 491, 490, 491, 492, 492, 513, 513, 513, 513, 513, 513,
+    492, 492, 492, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 492,
+    492, 492, 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 492, 513,
+    513, 492, 492, 490, 491, 490, 491, 513, 492, 492, 492, 492, 513, 492,
+    513, 513, 513, 492, 492, 513, 513, 492, 492, 492, 492, 492, 492, 492,
+    492, 492, 492, 513, 513, 513, 513, 513, 513, 492, 492, 490, 491, 492,
+    492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513,
+    492, 513, 513, 513, 513, 492, 492, 513, 492, 513, 492, 492, 513, 492,
+    513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 492, 492, 492,
+    492, 513, 513, 513, 513, 492, 513, 513, 492, 492, 513, 513, 492, 492,
+    492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+    492, 513, 513, 513, 513, 513, 513, 513, 513, 492, 513, 513, 513, 513,
+    513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 492, 513, 492, 492,
+    492, 513, 513, 513, 513, 513, 492, 492, 492, 492, 513, 492, 492, 492,
+    513, 513, 513, 513, 513, 492, 513, 492, 492, 41, 41, 41, 526, 526, 41,
+    41, 41, 492, 492, 492, 492, 492, 41, 41, 492, 492, 492, 492, 492, 492,
+    41, 41, 41, 526, 41, 41, 41, 41, 535, 508, 508, 41, 41, 41, 41, 82, 82,
+    41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 41, 41, 82, 82, 82, 41, 41, 41,
+    41, 82, 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 82, 82, 82, 82, 82, 82,
+    82, 82, 41, 41, 41, 41, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539,
+    539, 539, 539, 539, 539, 82, 540, 540, 540, 540, 540, 540, 540, 540, 540,
+    540, 540, 540, 540, 540, 540, 82, 53, 57, 53, 53, 53, 57, 57, 53, 57, 53,
+    57, 53, 57, 53, 53, 53, 53, 57, 53, 57, 57, 53, 57, 57, 57, 57, 57, 57,
+    60, 60, 53, 53, 88, 89, 88, 89, 89, 541, 541, 541, 541, 541, 541, 88, 89,
+    88, 89, 542, 542, 542, 88, 89, 82, 82, 82, 82, 82, 543, 544, 544, 544,
+    545, 543, 544, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
+    546, 546, 546, 82, 546, 82, 82, 82, 82, 82, 546, 82, 82, 547, 547, 547,
+    547, 547, 547, 547, 547, 82, 82, 82, 82, 82, 82, 82, 548, 549, 82, 82,
+    82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 550, 96, 96, 96, 96, 96,
+    96, 96, 96, 551, 551, 43, 51, 43, 51, 551, 551, 551, 43, 51, 551, 43, 51,
+    373, 373, 373, 373, 373, 373, 373, 373, 85, 466, 552, 373, 553, 85, 43,
+    51, 85, 85, 43, 51, 490, 491, 490, 491, 490, 491, 490, 491, 373, 373,
+    373, 373, 371, 61, 373, 373, 85, 373, 373, 85, 85, 85, 85, 85, 554, 554,
+    373, 373, 373, 85, 466, 373, 471, 373, 373, 82, 82, 82, 555, 555, 555,
+    555, 555, 555, 555, 555, 555, 555, 82, 555, 555, 555, 555, 555, 555, 555,
+    555, 555, 82, 82, 82, 82, 555, 555, 555, 555, 555, 555, 82, 82, 523, 523,
+    523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 82, 82, 82, 82, 556,
+    557, 557, 558, 523, 559, 560, 561, 524, 525, 524, 525, 524, 525, 524,
+    525, 524, 525, 523, 523, 524, 525, 524, 525, 524, 525, 524, 525, 562,
+    563, 564, 564, 523, 561, 561, 561, 561, 561, 561, 561, 561, 561, 565,
+    566, 567, 568, 569, 569, 570, 571, 571, 571, 571, 572, 523, 523, 561,
+    561, 561, 559, 573, 558, 523, 527, 82, 574, 575, 574, 575, 574, 575, 574,
+    575, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+    575, 575, 575, 575, 575, 574, 575, 575, 575, 575, 575, 575, 575, 574,
+    575, 574, 575, 574, 575, 575, 575, 575, 575, 575, 574, 575, 575, 575,
+    575, 575, 575, 574, 574, 82, 82, 576, 576, 577, 577, 578, 578, 575, 562,
+    579, 580, 579, 580, 579, 580, 579, 580, 579, 580, 580, 580, 580, 580,
+    580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 579, 580,
+    580, 580, 580, 580, 580, 580, 579, 580, 579, 580, 579, 580, 580, 580,
+    580, 580, 580, 579, 580, 580, 580, 580, 580, 580, 579, 579, 580, 580,
+    580, 580, 581, 582, 583, 583, 580, 82, 82, 82, 82, 82, 584, 584, 584,
+    584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 82,
+    82, 82, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+    585, 585, 585, 585, 585, 585, 585, 585, 585, 82, 586, 586, 587, 587, 587,
+    587, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 584, 584, 82,
+    82, 82, 82, 82, 579, 579, 579, 579, 579, 579, 579, 579, 588, 588, 588,
+    588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 82, 587, 587,
+    587, 587, 587, 587, 587, 587, 587, 587, 586, 586, 586, 586, 586, 586,
+    590, 590, 590, 590, 590, 590, 590, 590, 523, 591, 591, 591, 591, 591,
+    591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 588, 588, 588, 588,
+    589, 589, 589, 586, 586, 591, 591, 591, 591, 591, 591, 591, 586, 586,
+    586, 586, 523, 523, 523, 523, 592, 592, 592, 592, 592, 592, 592, 592,
+    592, 592, 592, 592, 592, 592, 592, 82, 586, 586, 586, 586, 586, 586, 586,
+    523, 523, 523, 523, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+    586, 523, 523, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593,
+    593, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
+    595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 596, 595,
+    595, 595, 595, 595, 595, 595, 82, 82, 82, 597, 597, 597, 597, 597, 597,
+    597, 597, 597, 597, 597, 597, 597, 597, 597, 82, 598, 598, 598, 598, 598,
+    598, 598, 598, 599, 599, 599, 599, 599, 599, 600, 600, 601, 601, 601,
+    601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 603, 604, 603, 605,
+    605, 605, 605, 605, 605, 605, 605, 605, 605, 601, 601, 82, 82, 82, 82,
+    91, 94, 91, 94, 91, 94, 606, 96, 98, 98, 98, 607, 96, 96, 96, 96, 96, 96,
+    96, 96, 96, 96, 607, 608, 91, 94, 91, 94, 450, 450, 96, 96, 609, 609,
+    609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610,
+    610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 612, 613, 613, 613,
+    613, 613, 63, 63, 63, 63, 63, 63, 63, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+    63, 63, 53, 57, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 57, 60, 57,
+    57, 57, 57, 57, 57, 57, 57, 53, 57, 53, 57, 53, 53, 57, 61, 614, 614, 53,
+    57, 53, 57, 58, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 53, 53, 53,
+    53, 82, 53, 53, 53, 53, 53, 57, 53, 57, 82, 82, 82, 82, 82, 82, 82, 58,
+    60, 60, 57, 58, 58, 58, 58, 58, 615, 615, 616, 615, 615, 615, 617, 615,
+    615, 615, 615, 616, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+    615, 615, 615, 615, 615, 618, 618, 616, 616, 618, 619, 619, 619, 619, 82,
+    82, 82, 82, 620, 620, 620, 620, 620, 620, 313, 313, 503, 512, 82, 82, 82,
+    82, 82, 82, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621,
+    622, 622, 623, 623, 624, 624, 625, 625, 625, 625, 625, 625, 625, 625,
+    625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 624, 624, 624, 624,
+    624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 626, 627, 82,
+    82, 82, 82, 82, 82, 82, 82, 628, 628, 629, 629, 629, 629, 629, 629, 629,
+    629, 629, 629, 82, 82, 82, 82, 82, 82, 198, 198, 198, 198, 198, 198, 198,
+    198, 198, 198, 195, 195, 195, 195, 195, 195, 201, 201, 201, 195, 630,
+    195, 82, 82, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 632,
+    632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632,
+    632, 632, 632, 632, 633, 633, 633, 633, 633, 634, 634, 634, 199, 635,
+    636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+    636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 638, 639, 82,
+    82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 640, 328, 328, 328, 328, 328, 82,
+    82, 82, 641, 641, 641, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643,
+    643, 643, 643, 643, 643, 643, 644, 642, 642, 641, 641, 641, 641, 642,
+    642, 641, 642, 642, 642, 645, 646, 646, 646, 646, 646, 646, 647, 647,
+    647, 646, 646, 646, 646, 82, 62, 648, 648, 648, 648, 648, 648, 648, 648,
+    648, 648, 82, 82, 82, 82, 646, 646, 314, 314, 314, 314, 314, 316, 649,
+    314, 319, 319, 314, 314, 314, 314, 314, 82, 650, 650, 650, 650, 650, 650,
+    650, 650, 650, 651, 651, 651, 651, 651, 651, 652, 652, 651, 651, 652,
+    652, 651, 651, 82, 650, 650, 650, 651, 650, 650, 650, 650, 650, 650, 650,
+    650, 651, 652, 82, 82, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+    82, 82, 654, 655, 655, 655, 649, 314, 314, 314, 314, 314, 314, 323, 323,
+    323, 314, 315, 316, 315, 314, 314, 656, 656, 656, 656, 656, 656, 656,
+    656, 657, 656, 657, 657, 658, 656, 656, 657, 657, 656, 656, 656, 656,
+    656, 657, 657, 656, 657, 656, 82, 82, 82, 82, 82, 82, 82, 82, 656, 656,
+    659, 660, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+    662, 663, 663, 662, 662, 664, 664, 661, 665, 665, 662, 666, 82, 82, 331,
+    331, 331, 331, 331, 331, 82, 57, 57, 57, 614, 60, 60, 60, 60, 57, 57, 57,
+    57, 57, 80, 82, 82, 338, 338, 338, 338, 338, 338, 338, 338, 661, 661,
+    661, 662, 662, 663, 662, 662, 663, 662, 662, 664, 662, 666, 82, 82, 667,
+    667, 667, 667, 667, 667, 667, 667, 667, 667, 82, 82, 82, 82, 82, 82, 668,
+    669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+    669, 669, 669, 669, 669, 668, 669, 669, 669, 669, 669, 669, 669, 82, 82,
+    82, 82, 329, 329, 329, 329, 329, 329, 329, 82, 82, 82, 82, 330, 330, 330,
+    330, 330, 330, 330, 330, 330, 82, 82, 82, 82, 670, 670, 670, 670, 670,
+    670, 670, 670, 671, 671, 671, 671, 671, 671, 671, 671, 593, 593, 594,
+    594, 594, 594, 594, 594, 57, 57, 57, 57, 57, 57, 57, 82, 82, 82, 82, 102,
+    102, 102, 102, 102, 82, 82, 82, 82, 82, 130, 672, 130, 130, 673, 130,
+    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 82, 130, 130,
+    130, 130, 130, 82, 130, 82, 130, 130, 82, 130, 130, 82, 130, 130, 147,
+    147, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
+    674, 674, 674, 82, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 147, 675, 471, 82, 82, 147, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 136, 139, 82, 82, 676, 676, 676, 676, 676,
+    676, 676, 676, 677, 557, 557, 677, 677, 678, 678, 563, 564, 679, 82, 82,
+    82, 82, 82, 82, 97, 97, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157,
+    157, 96, 96, 558, 570, 570, 680, 680, 563, 564, 563, 564, 563, 564, 563,
+    564, 563, 564, 563, 564, 563, 564, 563, 564, 558, 558, 563, 564, 558,
+    558, 558, 558, 680, 680, 680, 681, 558, 681, 82, 581, 682, 678, 678, 570,
+    524, 525, 524, 525, 524, 525, 683, 558, 558, 684, 685, 686, 686, 687, 82,
+    558, 688, 689, 558, 82, 82, 82, 82, 147, 147, 147, 147, 147, 82, 82, 493,
+    82, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698,
+    700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704,
+    705, 704, 690, 691, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+    706, 706, 706, 706, 706, 706, 706, 706, 695, 691, 696, 707, 708, 707,
+    709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
+    709, 709, 709, 709, 695, 705, 696, 705, 695, 696, 710, 711, 712, 710,
+    713, 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, 714, 714,
     714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
-    714, 714, 714, 714, 714, 714, 64, 64, 64, 715, 715, 715, 715, 715, 715,
-    715, 715, 715, 715, 64, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716,
-    716, 716, 717, 717, 717, 716, 716, 717, 718, 719, 717, 720, 720, 720,
-    720, 720, 720, 64, 64, 721, 721, 721, 721, 721, 721, 721, 64, 721, 64,
-    721, 721, 721, 721, 64, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721,
-    721, 721, 721, 721, 721, 64, 721, 721, 722, 64, 64, 64, 64, 64, 64, 723,
-    723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723,
-    724, 725, 725, 725, 724, 724, 724, 724, 724, 724, 726, 727, 64, 64, 64,
-    64, 64, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 64, 64, 64, 64,
-    64, 64, 729, 729, 730, 730, 64, 731, 731, 731, 731, 731, 731, 731, 731,
-    64, 64, 731, 731, 64, 64, 731, 731, 731, 731, 731, 731, 731, 731, 731,
-    731, 731, 731, 731, 731, 64, 731, 731, 731, 731, 731, 731, 731, 64, 731,
-    731, 64, 731, 731, 731, 731, 731, 64, 64, 732, 731, 730, 730, 729, 730,
-    730, 730, 730, 64, 64, 730, 730, 64, 64, 730, 730, 733, 64, 64, 731, 64,
-    64, 64, 64, 64, 64, 730, 64, 64, 64, 64, 64, 731, 731, 731, 731, 731,
-    730, 730, 64, 64, 734, 734, 734, 734, 734, 734, 734, 64, 64, 64, 735,
-    735, 735, 735, 735, 735, 735, 735, 736, 736, 736, 737, 737, 737, 737,
-    737, 737, 736, 737, 736, 736, 736, 736, 737, 737, 736, 738, 739, 735,
-    735, 740, 735, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 64, 64,
-    64, 64, 64, 64, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
-    742, 742, 742, 742, 743, 743, 743, 744, 744, 744, 744, 64, 64, 743, 743,
-    743, 743, 744, 744, 743, 745, 746, 747, 747, 747, 747, 747, 747, 747,
-    747, 747, 747, 747, 747, 747, 747, 747, 742, 742, 742, 742, 744, 744, 64,
-    64, 748, 748, 748, 748, 748, 748, 748, 748, 749, 749, 749, 750, 750, 750,
-    750, 750, 750, 750, 750, 749, 749, 750, 749, 751, 750, 752, 752, 752,
-    748, 64, 64, 64, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 64,
-    64, 64, 64, 64, 64, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
-    754, 755, 756, 755, 756, 756, 755, 755, 755, 755, 755, 755, 757, 758,
-    759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 64, 64, 64, 64, 64, 64,
-    760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 64, 64, 64, 761, 761,
-    761, 762, 762, 761, 761, 761, 761, 762, 761, 761, 761, 761, 763, 64, 64,
-    64, 64, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, 766,
-    766, 766, 767, 768, 768, 768, 768, 768, 768, 768, 768, 769, 769, 769,
-    769, 769, 769, 769, 769, 770, 770, 770, 770, 770, 770, 770, 770, 770,
-    770, 771, 771, 771, 771, 771, 771, 771, 771, 771, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 772, 773, 773, 773, 773, 773, 773, 773, 773, 773,
-    64, 64, 64, 64, 64, 64, 64, 774, 774, 774, 774, 774, 774, 774, 774, 774,
-    774, 64, 64, 64, 64, 64, 64, 775, 775, 775, 775, 775, 775, 775, 775, 775,
-    775, 775, 775, 775, 775, 775, 64, 776, 776, 776, 776, 776, 64, 64, 64,
-    774, 774, 774, 774, 64, 64, 64, 64, 777, 777, 777, 777, 777, 777, 777,
-    777, 777, 777, 777, 777, 777, 777, 777, 64, 778, 778, 778, 778, 778, 778,
-    778, 778, 778, 778, 778, 778, 778, 778, 778, 64, 511, 64, 64, 64, 64, 64,
-    64, 64, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
-    779, 779, 64, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 64, 64,
-    64, 64, 781, 781, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782,
-    782, 782, 782, 64, 64, 783, 783, 783, 783, 783, 784, 64, 64, 785, 785,
-    785, 785, 785, 785, 785, 785, 786, 786, 786, 786, 786, 786, 786, 787,
-    787, 787, 787, 787, 788, 788, 788, 788, 789, 789, 789, 789, 787, 788, 64,
-    64, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 64, 791, 791, 791,
-    791, 791, 791, 791, 64, 785, 785, 785, 785, 785, 64, 64, 64, 64, 64, 785,
-    785, 785, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
-    792, 64, 64, 64, 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793,
-    793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 64, 64, 64,
-    64, 64, 64, 64, 64, 794, 794, 794, 794, 795, 795, 795, 795, 795, 795,
-    795, 795, 795, 795, 795, 795, 795, 486, 482, 64, 64, 64, 64, 64, 64, 796,
-    796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 64, 64, 64, 64, 64,
-    796, 796, 796, 796, 796, 64, 64, 64, 796, 64, 64, 64, 64, 64, 64, 64,
-    796, 796, 64, 64, 797, 798, 799, 800, 410, 410, 410, 410, 64, 64, 64, 64,
-    277, 277, 277, 277, 277, 277, 64, 64, 277, 277, 277, 277, 277, 277, 277,
-    64, 64, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 801,
-    801, 400, 400, 400, 277, 277, 277, 802, 801, 801, 801, 801, 801, 410,
-    410, 410, 410, 410, 410, 410, 410, 136, 136, 136, 136, 136, 136, 136,
-    136, 277, 277, 78, 78, 78, 78, 78, 136, 136, 277, 277, 277, 277, 277,
-    277, 78, 78, 78, 78, 277, 277, 277, 64, 64, 64, 64, 64, 64, 64, 606, 606,
-    803, 803, 803, 606, 64, 64, 521, 521, 64, 64, 64, 64, 64, 64, 442, 442,
-    442, 442, 442, 442, 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 34,
-    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442,
-    442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34,
-    34, 442, 64, 442, 442, 64, 64, 442, 64, 64, 442, 442, 64, 64, 442, 442,
-    442, 442, 64, 442, 442, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34,
-    64, 34, 34, 34, 34, 34, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 64,
-    442, 442, 442, 442, 442, 442, 442, 442, 64, 442, 442, 442, 442, 442, 442,
-    442, 64, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 442, 442, 442,
-    442, 442, 64, 442, 64, 64, 64, 442, 442, 442, 442, 442, 442, 442, 64, 34,
-    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 442, 804, 34, 34, 34,
-    34, 34, 34, 34, 34, 34, 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442,
-    442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34, 445,
-    34, 34, 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-    445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442, 442, 442, 442,
-    804, 34, 445, 34, 34, 34, 34, 34, 34, 34, 34, 442, 34, 64, 64, 805, 805,
-    805, 805, 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, 806, 806,
-    806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
-    807, 807, 807, 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807,
-    807, 807, 807, 806, 806, 806, 806, 806, 806, 806, 806, 807, 806, 806,
-    806, 806, 806, 806, 807, 806, 806, 808, 808, 808, 808, 808, 64, 64, 64,
-    64, 64, 64, 64, 807, 807, 807, 807, 807, 64, 807, 807, 807, 807, 807,
-    807, 807, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809,
-    809, 64, 64, 810, 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, 811,
-    811, 811, 811, 811, 64, 126, 126, 126, 126, 64, 126, 126, 126, 64, 126,
-    126, 64, 126, 64, 64, 126, 64, 126, 126, 126, 126, 126, 126, 126, 126,
-    126, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126, 64, 64, 64, 64, 64,
-    64, 126, 64, 64, 64, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 64,
-    126, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126,
-    126, 64, 126, 126, 126, 126, 126, 126, 126, 126, 126, 64, 64, 64, 64, 64,
-    126, 126, 126, 64, 126, 126, 126, 113, 113, 64, 64, 64, 64, 64, 64, 64,
-    26, 26, 26, 26, 26, 26, 26, 33, 33, 33, 446, 446, 64, 64, 64, 453, 453,
-    453, 453, 453, 453, 277, 64, 453, 453, 26, 26, 64, 64, 64, 64, 453, 453,
-    453, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 277, 277, 812, 489, 489,
-    64, 64, 64, 64, 64, 489, 489, 489, 64, 64, 64, 64, 64, 489, 64, 64, 64,
-    64, 64, 64, 64, 489, 489, 64, 64, 64, 64, 64, 64, 26, 26, 26, 47, 47, 47,
-    47, 47, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26,
-    26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 64, 64, 64, 496, 496,
-    496, 496, 496, 496, 496, 497, 496, 496, 496, 496, 496, 497, 497, 497,
-    497, 497, 497, 497, 497, 497, 64, 64, 64, 410, 64, 64, 64, 64, 64, 64,
-    410, 410, 410, 410, 410, 410, 410, 410, 565, 565, 565, 565, 565, 565, 64,
-    64,
+    714, 714, 714, 714, 714, 717, 717, 718, 718, 718, 718, 718, 718, 718,
+    718, 718, 718, 718, 718, 718, 718, 718, 82, 82, 82, 718, 718, 718, 718,
+    718, 718, 82, 82, 718, 718, 718, 82, 82, 82, 719, 693, 705, 707, 720,
+    693, 693, 82, 721, 722, 722, 722, 722, 721, 721, 82, 82, 723, 723, 723,
+    724, 508, 82, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725,
+    725, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 82, 725, 725,
+    725, 82, 725, 725, 82, 725, 725, 725, 725, 725, 725, 725, 82, 82, 725,
+    725, 725, 82, 82, 82, 82, 82, 199, 373, 199, 82, 82, 82, 82, 620, 620,
+    620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 82, 82, 82, 313,
+    726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 727,
+    727, 727, 727, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728,
+    728, 728, 728, 728, 728, 728, 727, 727, 728, 729, 729, 82, 41, 41, 41,
+    41, 82, 82, 82, 82, 728, 82, 82, 82, 82, 82, 82, 82, 313, 313, 313, 313,
+    313, 157, 82, 82, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
+    730, 730, 82, 82, 82, 731, 731, 731, 731, 731, 731, 731, 731, 731, 82,
+    82, 82, 82, 82, 82, 82, 157, 500, 500, 500, 500, 500, 500, 500, 500, 500,
+    500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 82, 82, 82, 82, 732,
+    732, 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, 82, 82, 82, 82,
+    734, 734, 734, 734, 734, 734, 734, 734, 734, 735, 734, 734, 734, 734,
+    734, 734, 734, 734, 735, 82, 82, 82, 82, 82, 736, 736, 736, 736, 736,
+    736, 736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 82,
+    82, 82, 82, 82, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
+    738, 738, 738, 82, 739, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740,
+    740, 740, 82, 82, 82, 82, 741, 742, 742, 742, 742, 742, 82, 82, 743, 743,
+    743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, 744,
+    745, 745, 745, 745, 745, 745, 745, 745, 746, 746, 746, 746, 746, 746,
+    746, 746, 746, 746, 746, 746, 746, 746, 82, 82, 747, 747, 747, 747, 747,
+    747, 747, 747, 747, 747, 82, 82, 82, 82, 82, 82, 748, 748, 748, 748, 748,
+    748, 748, 748, 748, 748, 748, 748, 82, 82, 82, 82, 749, 749, 749, 749,
+    749, 749, 749, 749, 749, 749, 749, 749, 82, 82, 82, 82, 750, 750, 750,
+    750, 750, 750, 750, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+    751, 751, 751, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 752, 753, 753,
+    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 82, 753,
+    753, 753, 753, 753, 753, 82, 82, 754, 754, 754, 754, 754, 754, 82, 82,
+    754, 82, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
+    754, 754, 754, 754, 754, 754, 754, 82, 754, 754, 82, 82, 82, 754, 82, 82,
+    754, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755,
+    755, 82, 756, 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, 758, 758,
+    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 759, 760,
+    760, 760, 760, 760, 760, 760, 761, 761, 761, 761, 761, 761, 761, 761,
+    761, 761, 761, 761, 761, 761, 761, 82, 82, 82, 82, 82, 82, 82, 82, 762,
+    762, 762, 762, 762, 762, 762, 762, 762, 763, 763, 763, 763, 763, 763,
+    763, 763, 763, 763, 763, 82, 763, 763, 82, 82, 82, 82, 82, 764, 764, 764,
+    764, 764, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765,
+    765, 765, 766, 766, 766, 766, 766, 766, 82, 82, 82, 767, 768, 768, 768,
+    768, 768, 768, 768, 768, 768, 768, 82, 82, 82, 82, 82, 769, 770, 770,
+    770, 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 82,
+    82, 82, 82, 772, 772, 771, 771, 772, 772, 772, 772, 772, 772, 772, 772,
+    82, 82, 772, 772, 772, 772, 772, 772, 773, 774, 774, 774, 82, 774, 774,
+    82, 82, 82, 82, 82, 774, 775, 774, 776, 773, 773, 773, 773, 82, 773, 773,
+    773, 82, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773,
+    773, 773, 773, 773, 773, 773, 82, 82, 82, 82, 776, 777, 775, 82, 82, 82,
+    82, 778, 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, 780, 780, 780,
+    780, 780, 780, 781, 82, 82, 82, 82, 82, 82, 82, 782, 782, 782, 782, 782,
+    782, 782, 782, 782, 782, 782, 782, 782, 783, 783, 784, 785, 785, 785,
+    785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, 786, 787,
+    787, 787, 787, 787, 787, 787, 787, 788, 787, 787, 787, 787, 787, 787,
+    787, 787, 787, 787, 787, 787, 789, 790, 82, 82, 82, 82, 791, 791, 791,
+    791, 791, 792, 792, 792, 792, 792, 792, 793, 82, 794, 794, 794, 794, 794,
+    794, 794, 794, 794, 794, 794, 794, 794, 794, 82, 82, 82, 795, 795, 795,
+    795, 795, 795, 795, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+    796, 796, 796, 796, 82, 82, 797, 797, 797, 797, 797, 797, 797, 797, 798,
+    798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 82, 82, 82, 82, 82,
+    799, 799, 799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800,
+    800, 800, 800, 800, 82, 82, 82, 82, 82, 82, 82, 801, 801, 801, 801, 82,
+    82, 82, 82, 802, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803,
+    803, 803, 803, 803, 82, 82, 82, 82, 82, 82, 82, 804, 804, 804, 804, 804,
+    804, 804, 804, 804, 804, 804, 82, 82, 82, 82, 82, 805, 805, 805, 805,
+    805, 805, 805, 805, 805, 805, 805, 82, 82, 82, 82, 82, 82, 82, 806, 806,
+    806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+    807, 807, 807, 807, 807, 82, 808, 809, 808, 810, 810, 810, 810, 810, 810,
+    810, 810, 810, 810, 810, 810, 810, 809, 809, 809, 809, 809, 809, 809,
+    809, 809, 809, 809, 809, 809, 809, 811, 812, 812, 813, 813, 813, 813,
+    813, 82, 82, 82, 82, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814,
+    814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, 815, 815, 815,
+    815, 815, 815, 815, 815, 815, 82, 82, 82, 82, 82, 82, 82, 811, 816, 816,
+    817, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+    817, 817, 817, 816, 816, 816, 816, 817, 817, 819, 820, 821, 821, 822,
+    823, 823, 823, 823, 82, 82, 82, 82, 82, 82, 824, 824, 824, 824, 824, 824,
+    824, 824, 824, 82, 82, 82, 82, 82, 82, 82, 825, 825, 825, 825, 825, 825,
+    825, 825, 825, 825, 82, 82, 82, 82, 82, 82, 826, 826, 826, 827, 827, 827,
+    827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+    827, 827, 827, 828, 828, 828, 828, 828, 829, 828, 828, 828, 828, 828,
+    828, 830, 830, 82, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 832,
+    832, 832, 832, 82, 82, 82, 82, 833, 833, 833, 833, 833, 833, 833, 833,
+    833, 833, 833, 834, 835, 836, 833, 82, 837, 837, 838, 839, 839, 839, 839,
+    839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 838, 838,
+    838, 837, 837, 837, 837, 837, 837, 837, 837, 837, 838, 840, 839, 839,
+    839, 839, 841, 841, 842, 841, 842, 843, 837, 837, 842, 82, 82, 844, 844,
+    844, 844, 844, 844, 844, 844, 844, 844, 839, 845, 839, 841, 841, 841, 82,
+    846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
+    846, 846, 846, 846, 846, 846, 82, 82, 82, 847, 847, 847, 847, 847, 847,
+    847, 847, 847, 847, 82, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848,
+    848, 848, 849, 849, 849, 848, 848, 849, 850, 851, 849, 852, 852, 853,
+    852, 852, 853, 849, 82, 854, 854, 854, 854, 854, 854, 854, 82, 854, 82,
+    854, 854, 854, 854, 82, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
+    854, 854, 854, 854, 854, 82, 854, 854, 855, 82, 82, 82, 82, 82, 82, 856,
+    856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+    857, 858, 858, 858, 857, 857, 857, 857, 857, 857, 859, 860, 82, 82, 82,
+    82, 82, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 82, 82, 82, 82,
+    82, 82, 862, 862, 863, 863, 82, 864, 864, 864, 864, 864, 864, 864, 864,
+    82, 82, 864, 864, 82, 82, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+    864, 864, 864, 864, 864, 82, 864, 864, 864, 864, 864, 864, 864, 82, 864,
+    864, 82, 864, 864, 864, 864, 864, 82, 82, 865, 864, 863, 863, 862, 863,
+    863, 863, 863, 82, 82, 863, 863, 82, 82, 863, 863, 866, 82, 82, 864, 82,
+    82, 82, 82, 82, 82, 863, 82, 82, 82, 82, 82, 864, 864, 864, 864, 864,
+    863, 863, 82, 82, 867, 867, 867, 867, 867, 867, 867, 82, 82, 82, 868,
+    868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869,
+    869, 870, 870, 870, 870, 870, 870, 870, 870, 869, 869, 871, 870, 870,
+    869, 872, 868, 868, 868, 868, 873, 873, 873, 873, 874, 875, 875, 875,
+    875, 875, 875, 875, 875, 875, 875, 82, 873, 82, 874, 82, 82, 876, 876,
+    876, 876, 876, 876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 878,
+    878, 877, 878, 877, 877, 877, 877, 878, 878, 877, 879, 880, 876, 876,
+    881, 876, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 82, 82, 82,
+    82, 82, 82, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
+    883, 883, 883, 884, 884, 884, 885, 885, 885, 885, 82, 82, 884, 884, 884,
+    884, 885, 885, 884, 886, 887, 888, 889, 889, 890, 890, 891, 891, 891,
+    889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889,
+    889, 883, 883, 883, 883, 885, 885, 82, 82, 892, 892, 892, 892, 892, 892,
+    892, 892, 893, 893, 893, 894, 894, 894, 894, 894, 894, 894, 894, 893,
+    893, 894, 893, 895, 894, 896, 896, 897, 892, 82, 82, 82, 898, 898, 898,
+    898, 898, 898, 898, 898, 898, 898, 82, 82, 82, 82, 82, 82, 899, 899, 899,
+    899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 82, 82, 82, 900, 900,
+    900, 900, 900, 900, 900, 900, 900, 900, 900, 901, 902, 901, 902, 902,
+    901, 901, 901, 901, 901, 901, 903, 904, 905, 905, 905, 905, 905, 905,
+    905, 905, 905, 905, 82, 82, 82, 82, 82, 82, 906, 906, 906, 906, 906, 906,
+    906, 906, 906, 906, 82, 82, 82, 907, 907, 907, 908, 908, 907, 907, 907,
+    907, 908, 907, 907, 907, 907, 909, 82, 82, 82, 82, 910, 910, 910, 910,
+    910, 910, 910, 910, 910, 910, 911, 911, 912, 912, 912, 913, 914, 914,
+    914, 914, 914, 914, 914, 914, 915, 915, 915, 915, 915, 915, 915, 915,
+    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917,
+    917, 917, 917, 917, 917, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+    918, 919, 919, 919, 919, 919, 919, 919, 919, 919, 82, 82, 82, 82, 82, 82,
+    82, 920, 920, 920, 920, 920, 920, 920, 920, 920, 82, 920, 920, 920, 920,
+    920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 922, 922, 922, 922,
+    922, 922, 922, 82, 922, 922, 922, 922, 922, 922, 921, 923, 920, 924, 924,
+    924, 924, 924, 82, 82, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925,
+    926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926,
+    926, 926, 926, 926, 926, 82, 82, 82, 927, 928, 929, 929, 929, 929, 929,
+    929, 929, 929, 929, 929, 929, 929, 929, 929, 82, 82, 930, 930, 930, 930,
+    930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 82, 931, 930, 930, 930,
+    930, 930, 930, 930, 931, 930, 930, 931, 930, 930, 82, 932, 932, 932, 932,
+    932, 932, 932, 932, 932, 932, 82, 82, 82, 82, 82, 82, 933, 933, 933, 933,
+    933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 82, 934, 934, 934,
+    934, 934, 82, 82, 82, 932, 932, 932, 932, 82, 82, 82, 82, 935, 935, 935,
+    935, 935, 935, 935, 935, 936, 936, 936, 937, 937, 937, 935, 935, 935,
+    935, 937, 935, 935, 935, 936, 937, 936, 937, 935, 935, 935, 935, 935,
+    935, 935, 936, 937, 937, 935, 935, 935, 935, 935, 935, 935, 935, 935,
+    935, 935, 82, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+    938, 938, 939, 940, 938, 938, 938, 938, 938, 938, 938, 82, 609, 82, 82,
+    82, 82, 82, 82, 82, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941,
+    941, 941, 941, 941, 941, 82, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+    942, 82, 82, 82, 82, 943, 943, 944, 944, 944, 944, 944, 944, 944, 944,
+    944, 944, 944, 944, 944, 944, 82, 82, 945, 945, 945, 945, 945, 946, 82,
+    82, 947, 947, 947, 947, 947, 947, 947, 947, 948, 948, 948, 948, 948, 948,
+    948, 949, 949, 949, 950, 950, 951, 951, 951, 951, 952, 952, 952, 952,
+    949, 951, 82, 82, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 82,
+    954, 954, 954, 954, 954, 954, 954, 82, 947, 947, 947, 947, 947, 82, 82,
+    82, 82, 82, 947, 947, 947, 955, 955, 955, 955, 955, 955, 955, 955, 955,
+    955, 955, 955, 955, 82, 82, 82, 955, 956, 956, 956, 956, 956, 956, 956,
+    956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956,
+    956, 82, 82, 82, 82, 82, 82, 82, 82, 957, 957, 957, 957, 958, 958, 958,
+    958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 959, 82, 82, 82, 82,
+    82, 82, 82, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+    960, 82, 82, 82, 960, 960, 960, 82, 82, 82, 82, 82, 580, 575, 82, 82, 82,
+    82, 82, 82, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 82,
+    82, 82, 82, 82, 961, 961, 961, 961, 961, 82, 82, 82, 961, 82, 82, 82, 82,
+    82, 82, 82, 961, 961, 82, 82, 962, 963, 964, 965, 499, 499, 499, 499, 82,
+    82, 82, 82, 313, 313, 313, 313, 313, 313, 82, 82, 313, 313, 313, 313,
+    313, 313, 313, 82, 82, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
+    313, 313, 966, 966, 447, 447, 447, 313, 313, 313, 967, 966, 966, 966,
+    966, 966, 499, 499, 499, 499, 499, 499, 499, 499, 157, 157, 157, 157,
+    157, 157, 157, 157, 313, 313, 97, 97, 97, 97, 97, 157, 157, 313, 313,
+    313, 313, 313, 313, 97, 97, 97, 97, 313, 313, 313, 82, 82, 82, 82, 82,
+    82, 82, 728, 728, 968, 968, 968, 728, 82, 82, 620, 620, 82, 82, 82, 82,
+    82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50,
+    50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 506, 506, 506,
+    506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, 50, 50, 50, 82, 50,
+    50, 50, 50, 50, 50, 506, 82, 506, 506, 82, 82, 506, 82, 82, 506, 506, 82,
+    82, 506, 506, 506, 506, 82, 506, 506, 50, 50, 82, 50, 82, 50, 50, 50, 50,
+    50, 50, 50, 82, 50, 50, 50, 50, 50, 50, 50, 506, 506, 82, 506, 506, 506,
+    506, 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 82, 506, 506, 506,
+    506, 506, 506, 506, 82, 50, 50, 506, 506, 82, 506, 506, 506, 506, 82,
+    506, 506, 506, 506, 506, 82, 506, 82, 82, 82, 506, 506, 506, 506, 506,
+    506, 506, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 82, 82,
+    506, 969, 50, 50, 50, 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50,
+    50, 506, 506, 506, 506, 506, 506, 506, 506, 506, 969, 50, 50, 50, 50, 50,
+    50, 50, 50, 50, 513, 50, 50, 506, 506, 506, 506, 506, 969, 50, 50, 50,
+    50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, 50, 506, 506, 506, 506,
+    506, 506, 506, 506, 506, 969, 50, 513, 50, 50, 50, 50, 50, 50, 50, 50,
+    506, 50, 82, 82, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971,
+    971, 971, 971, 971, 971, 971, 971, 972, 972, 972, 972, 972, 972, 972,
+    972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 972, 972,
+    972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 971, 971,
+    971, 971, 972, 971, 971, 971, 971, 971, 971, 972, 971, 971, 973, 973,
+    973, 973, 974, 82, 82, 82, 82, 82, 82, 82, 972, 972, 972, 972, 972, 82,
+    972, 972, 972, 972, 972, 972, 972, 975, 975, 975, 975, 975, 975, 975, 82,
+    975, 975, 975, 975, 975, 975, 975, 975, 975, 82, 82, 975, 975, 975, 975,
+    975, 975, 975, 82, 975, 975, 82, 975, 975, 975, 975, 975, 82, 82, 82, 82,
+    82, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 82,
+    82, 977, 977, 977, 977, 977, 977, 977, 977, 977, 978, 978, 978, 978, 978,
+    978, 978, 82, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 980, 980,
+    980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980,
+    980, 980, 981, 981, 981, 981, 981, 981, 982, 82, 82, 82, 82, 82, 983,
+    983, 983, 983, 983, 983, 983, 983, 983, 983, 82, 82, 82, 82, 984, 984,
+    147, 147, 147, 147, 82, 147, 147, 147, 82, 147, 147, 82, 147, 82, 82,
+    147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 82, 147, 147,
+    147, 147, 82, 147, 82, 147, 82, 82, 82, 82, 82, 82, 147, 82, 82, 82, 82,
+    147, 82, 147, 82, 147, 82, 147, 147, 147, 82, 147, 82, 147, 82, 147, 82,
+    147, 82, 147, 147, 147, 147, 82, 147, 82, 147, 147, 82, 147, 147, 147,
+    147, 147, 147, 147, 147, 147, 82, 82, 82, 82, 82, 147, 147, 147, 82, 147,
+    147, 147, 133, 133, 82, 82, 82, 82, 82, 82, 527, 527, 527, 527, 523, 527,
+    527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527,
+    985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 527, 527,
+    527, 527, 527, 527, 527, 985, 985, 527, 527, 527, 527, 527, 527, 527,
+    527, 527, 527, 527, 527, 527, 527, 523, 527, 527, 527, 527, 527, 527,
+    985, 985, 48, 48, 48, 516, 516, 985, 985, 985, 528, 528, 528, 528, 528,
+    528, 313, 985, 528, 528, 41, 41, 985, 985, 985, 985, 528, 528, 528, 528,
+    528, 528, 986, 528, 528, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+    986, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 985, 985, 985,
+    985, 985, 985, 985, 985, 985, 987, 987, 987, 987, 987, 987, 987, 987,
+    987, 987, 988, 586, 586, 985, 985, 985, 985, 985, 586, 586, 586, 586,
+    985, 985, 985, 985, 586, 985, 985, 985, 985, 985, 985, 985, 586, 586,
+    985, 985, 985, 985, 985, 985, 523, 527, 527, 527, 527, 527, 527, 527,
+    527, 527, 527, 527, 527, 523, 523, 523, 523, 523, 523, 523, 523, 523,
+    527, 523, 523, 523, 523, 523, 523, 527, 523, 523, 523, 523, 523, 523,
+    523, 534, 523, 523, 523, 523, 523, 523, 527, 527, 527, 527, 527, 527,
+    527, 527, 41, 41, 527, 527, 523, 523, 523, 523, 523, 526, 526, 523, 523,
+    523, 523, 523, 526, 523, 523, 523, 523, 523, 523, 534, 534, 523, 523,
+    523, 523, 523, 534, 532, 527, 527, 527, 523, 523, 527, 527, 527, 523,
+    527, 527, 527, 523, 523, 523, 989, 989, 989, 989, 989, 523, 523, 523,
+    523, 523, 523, 523, 527, 523, 527, 534, 534, 523, 523, 534, 534, 534,
+    534, 534, 534, 534, 534, 534, 534, 534, 523, 523, 523, 523, 523, 523,
+    523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 534, 523, 523, 523,
+    523, 534, 523, 534, 523, 523, 523, 534, 523, 523, 523, 523, 534, 534,
+    534, 523, 534, 534, 534, 526, 523, 526, 523, 526, 523, 523, 523, 523,
+    523, 534, 523, 523, 523, 523, 526, 523, 526, 526, 523, 523, 523, 523,
+    523, 523, 523, 523, 523, 523, 527, 527, 523, 526, 526, 526, 526, 526,
+    526, 526, 523, 523, 523, 523, 523, 523, 523, 523, 526, 526, 526, 526,
+    526, 526, 523, 523, 523, 523, 523, 526, 526, 526, 526, 526, 526, 526,
+    526, 526, 526, 526, 526, 41, 41, 41, 41, 527, 523, 523, 523, 523, 527,
+    527, 527, 527, 527, 527, 532, 527, 527, 527, 527, 534, 527, 527, 527,
+    527, 527, 532, 527, 527, 527, 527, 534, 534, 527, 527, 527, 527, 527, 41,
+    41, 41, 41, 41, 41, 41, 41, 527, 527, 527, 527, 41, 41, 527, 523, 523,
+    523, 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 523, 523, 523,
+    534, 534, 534, 534, 534, 41, 41, 41, 41, 41, 41, 536, 536, 536, 990, 990,
+    990, 41, 41, 41, 41, 523, 523, 523, 534, 523, 523, 523, 523, 523, 523,
+    523, 523, 534, 534, 534, 523, 534, 523, 523, 523, 523, 523, 527, 527,
+    523, 523, 523, 985, 985, 985, 985, 985, 527, 527, 527, 523, 523, 985,
+    985, 985, 527, 527, 527, 527, 523, 523, 523, 985, 41, 41, 41, 41, 985,
+    985, 985, 985, 41, 41, 41, 41, 41, 985, 985, 985, 41, 41, 985, 985, 985,
+    985, 985, 985, 41, 41, 41, 41, 41, 41, 985, 985, 534, 534, 534, 534, 534,
+    534, 534, 985, 523, 523, 523, 523, 523, 523, 534, 523, 534, 985, 985,
+    534, 534, 534, 534, 534, 534, 534, 523, 523, 534, 534, 534, 985, 523,
+    523, 523, 523, 985, 985, 985, 985, 523, 523, 523, 523, 523, 523, 523,
+    985, 523, 523, 985, 985, 985, 985, 985, 985, 523, 985, 985, 985, 985,
+    985, 985, 985, 985, 985, 985, 985, 985, 985, 82, 82, 593, 593, 593, 593,
+    593, 593, 593, 594, 593, 593, 593, 593, 593, 594, 594, 594, 594, 594,
+    594, 594, 594, 594, 82, 82, 82, 499, 82, 82, 82, 82, 82, 82, 499, 499,
+    499, 499, 499, 499, 499, 499, 671, 671, 671, 671, 671, 671, 82, 82,
 };
 
 /* decomposition data */
@@ -3874,98 +4326,98 @@ static const unsigned short decomp_data[] = {
     25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266,
     21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, 31354, 266,
     21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, 21106, 266,
-    21942, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308,
-    20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770,
-    12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309,
-    770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024,
-    256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, 256, 20411, 256,
-    20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256,
-    55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 55361,
-    56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, 56651, 256, 20887,
-    256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 55396, 56799, 256,
-    20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, 21106, 256,
-    21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, 21242, 256,
-    21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, 21338, 256,
-    21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, 55362, 56876,
-    256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, 256, 21483, 256,
-    21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256,
-    21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256,
-    21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256,
-    22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256,
-    22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256,
-    22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, 22790, 256, 22810,
-    256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, 57066, 256, 23020,
-    256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076,
-    256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, 256, 23491, 256,
-    23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, 23551, 256, 23558,
-    256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744,
-    256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, 56806, 256, 23918,
-    256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061,
-    256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, 55368, 56707, 256,
-    14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 256, 55400, 57234,
-    256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, 33281, 256, 24354,
-    256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, 56794, 256, 24418,
-    256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569,
-    256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 55369, 57044, 256,
-    24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256,
-    24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256,
-    25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256,
-    25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, 25448, 256, 25475,
-    256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, 256, 25513, 256,
-    14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256,
-    25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, 26360, 256, 26185,
-    256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885,
-    256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395,
-    256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, 256, 15177, 256,
-    26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, 56429, 256, 26766,
-    256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114,
-    256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, 256, 27425, 256,
-    55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, 27551, 256, 27578,
-    256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, 55374, 57082, 256,
-    27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, 27751, 256, 27926,
-    256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, 28037,
-    256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256,
-    28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, 28526, 256, 55375,
-    57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, 28702, 256, 28699,
-    256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 55361,
-    56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, 55376, 57259, 256,
-    29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, 29312, 256, 29333,
-    256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, 29579, 256, 16044,
-    256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 29788, 256, 29809,
-    256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 55379, 56374, 256,
-    30014, 256, 55379, 56466, 256, 30064, 256, 55368, 56735, 256, 30224, 256,
-    55379, 57249, 256, 55379, 57272, 256, 55380, 56388, 256, 16380, 256,
-    16392, 256, 30452, 256, 55380, 56563, 256, 55380, 56562, 256, 55380,
-    56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, 30495, 256, 30538,
-    256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, 55381, 56349, 256,
-    30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, 56870, 256, 31062,
-    256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, 31211, 256, 16687,
-    256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, 256, 55382, 56999,
-    256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, 57259, 256, 31686,
-    256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, 256, 17056, 256,
-    31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, 32099, 256, 17153,
-    256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 55384, 56872, 256,
-    55384, 56903, 256, 17241, 256, 55384, 57049, 256, 32634, 256, 55384,
-    57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, 56538, 256, 55385,
-    56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, 55372, 57183, 256,
-    17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 256, 23221, 256,
-    55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, 55372, 57244,
-    256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419,
-    256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510,
-    256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256,
-    33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256,
-    33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, 55387,
-    56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, 57290,
-    256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, 57265,
-    256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, 256,
-    34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, 256,
-    34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, 256,
-    17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, 35038,
-    256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, 56678,
-    256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925,
-    256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256,
-    55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, 256,
-    55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
+    21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309,
+    770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857,
+    12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308,
+    21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256,
+    20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398,
+    256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687,
+    256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256,
+    20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361,
+    56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256,
+    55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062,
+    256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220,
+    256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329,
+    256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375,
+    256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187,
+    256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576,
+    256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859,
+    256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954,
+    256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999,
+    256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578,
+    256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256,
+    22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365,
+    57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256,
+    14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776,
+    256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256,
+    23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256,
+    23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367,
+    56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256,
+    14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256,
+    55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266,
+    256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256,
+    33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384,
+    56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256,
+    24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256,
+    55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908,
+    256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054,
+    256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265,
+    256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256,
+    25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541,
+    256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719,
+    256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256,
+    26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256,
+    20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256,
+    26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283,
+    256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373,
+    56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256,
+    27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384,
+    256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256,
+    27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256,
+    55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256,
+    27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256,
+    28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270,
+    256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256,
+    28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256,
+    28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256,
+    28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256,
+    55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256,
+    29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256,
+    29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256,
+    29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256,
+    55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, 55368,
+    56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, 55380,
+    56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, 55380,
+    56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256,
+    30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256,
+    55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381,
+    56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256,
+    31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700,
+    256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382,
+    57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954,
+    256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256,
+    32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256,
+    55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, 57049, 256,
+    32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385,
+    56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256,
+    55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086,
+    256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256,
+    55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425,
+    256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469,
+    256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256,
+    33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256,
+    33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256,
+    55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388,
+    57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387,
+    57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407,
+    256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681,
+    256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817,
+    256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256,
+    35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390,
+    56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256,
+    35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215,
+    256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336,
+    256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
     56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, 256, 37147,
     256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909,
     256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, 55395, 56695,
@@ -4642,64 +5094,64 @@ static const unsigned short decomp_index2[] = {
     13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121,
     13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141,
     13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161,
-    13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 0, 0, 0, 0, 0,
-    13179, 13183, 13187, 13191, 13195, 13199, 13203, 13207, 13211, 0, 0, 0,
-    0, 0, 0, 0, 13215, 13217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    13219, 13221, 13223, 13225, 13228, 13230, 13232, 13234, 13236, 13238,
-    13240, 13242, 13244, 13246, 13249, 13251, 13253, 13255, 13257, 13260,
-    13262, 13264, 13266, 13269, 13271, 13273, 13275, 13277, 13279, 13282,
-    13284, 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302,
-    13304, 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322,
-    13324, 13326, 13328, 13331, 13333, 13335, 13337, 13340, 13342, 13344,
-    13346, 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364,
-    13366, 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384,
-    13386, 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404,
-    13407, 13409, 13411, 13413, 13415, 13417, 13419, 13422, 13425, 13427,
-    13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13448,
-    13450, 13452, 13454, 13456, 13459, 13461, 13463, 13465, 13467, 13469,
-    13471, 13473, 13475, 13477, 13480, 13482, 13485, 13487, 13489, 13491,
-    13493, 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13510, 13512,
-    13514, 13516, 13518, 13520, 13523, 13525, 13528, 13531, 13533, 13535,
-    13537, 13539, 13542, 13545, 13547, 13549, 13551, 13553, 13555, 13557,
-    13559, 13561, 13563, 13565, 13567, 13570, 13572, 13574, 13576, 13578,
-    13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598,
-    13600, 13602, 13604, 13606, 13608, 13611, 13613, 13615, 13617, 13619,
-    13621, 13624, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640,
-    13642, 13644, 13646, 13649, 13651, 13653, 13655, 13657, 13659, 13661,
-    13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681,
-    13683, 13685, 13688, 13690, 13692, 13694, 13696, 13698, 13701, 13703,
-    13705, 13707, 13709, 13711, 13713, 13715, 13717, 13720, 13722, 13724,
-    13726, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13744, 13747,
-    13750, 13752, 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769,
-    13771, 13773, 13775, 13778, 13780, 13782, 13784, 13786, 13788, 13790,
-    13793, 13795, 13797, 13800, 13803, 13805, 13807, 13809, 13811, 13813,
-    13815, 13817, 13819, 13821, 13824, 13826, 13829, 13831, 13834, 13836,
-    13838, 13840, 13843, 13845, 13847, 13850, 13853, 13855, 13857, 13859,
-    13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879,
-    13882, 13884, 13887, 13889, 13892, 13894, 13897, 13900, 13903, 13905,
-    13907, 13909, 13912, 13915, 13918, 13921, 13923, 13925, 13927, 13929,
-    13931, 13933, 13935, 13937, 13940, 13942, 13944, 13946, 13948, 13951,
-    13953, 13956, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13974,
-    13977, 13980, 13982, 13984, 13987, 13989, 13991, 13993, 13996, 13998,
-    14000, 14002, 14004, 14006, 14009, 14011, 14013, 14015, 14017, 14019,
-    14021, 14024, 14027, 14029, 14032, 14034, 14037, 14039, 14041, 14043,
-    14046, 14049, 14051, 14054, 14056, 14059, 14061, 14063, 14065, 14067,
-    14069, 14071, 14074, 14077, 14080, 14083, 14085, 14087, 14089, 14091,
-    14093, 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14110, 14112,
-    14114, 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132,
-    14134, 14137, 14140, 14143, 14145, 14147, 14149, 14151, 14154, 14156,
-    14159, 14161, 14163, 14166, 14169, 14171, 14173, 14175, 14177, 14179,
-    14181, 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199,
-    14201, 14203, 14205, 14207, 14210, 14212, 14214, 14216, 14218, 14220,
-    14223, 14226, 14228, 14230, 14232, 14234, 14236, 14238, 14241, 14243,
-    14245, 14247, 14249, 14252, 14255, 14257, 14259, 14261, 14264, 14266,
-    14268, 14271, 14274, 14276, 14278, 14280, 14283, 14285, 14287, 14289,
-    14291, 14293, 14295, 14297, 14300, 14302, 14304, 14306, 14309, 14311,
-    14313, 14315, 14317, 14320, 14323, 14325, 14327, 14329, 14332, 14334,
-    14337, 14339, 14341, 14343, 14346, 14348, 14350, 14352, 14354, 14356,
-    14358, 14360, 14363, 14365, 14367, 14369, 14371, 14373, 14375, 14378,
-    14380, 14383, 14386, 14389, 14391, 14393, 14395, 14397, 14399, 14401,
-    14403, 14405, 0, 0,
+    13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 0, 0, 0,
+    0, 13181, 13185, 13189, 13193, 13197, 13201, 13205, 13209, 13213, 0, 0,
+    0, 0, 0, 0, 0, 13217, 13219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    13221, 13223, 13225, 13227, 13230, 13232, 13234, 13236, 13238, 13240,
+    13242, 13244, 13246, 13248, 13251, 13253, 13255, 13257, 13259, 13262,
+    13264, 13266, 13268, 13271, 13273, 13275, 13277, 13279, 13281, 13284,
+    13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, 13304,
+    13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, 13324,
+    13326, 13328, 13330, 13333, 13335, 13337, 13339, 13342, 13344, 13346,
+    13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, 13366,
+    13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, 13386,
+    13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, 13406,
+    13409, 13411, 13413, 13415, 13417, 13419, 13421, 13424, 13427, 13429,
+    13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13450,
+    13452, 13454, 13456, 13458, 13461, 13463, 13465, 13467, 13469, 13471,
+    13473, 13475, 13477, 13479, 13482, 13484, 13487, 13489, 13491, 13493,
+    13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13512, 13514,
+    13516, 13518, 13520, 13522, 13525, 13527, 13530, 13533, 13535, 13537,
+    13539, 13541, 13544, 13547, 13549, 13551, 13553, 13555, 13557, 13559,
+    13561, 13563, 13565, 13567, 13569, 13572, 13574, 13576, 13578, 13580,
+    13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, 13600,
+    13602, 13604, 13606, 13608, 13610, 13613, 13615, 13617, 13619, 13621,
+    13623, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, 13642,
+    13644, 13646, 13648, 13651, 13653, 13655, 13657, 13659, 13661, 13663,
+    13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683,
+    13685, 13687, 13690, 13692, 13694, 13696, 13698, 13700, 13703, 13705,
+    13707, 13709, 13711, 13713, 13715, 13717, 13719, 13722, 13724, 13726,
+    13728, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13746, 13749,
+    13752, 13754, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771,
+    13773, 13775, 13777, 13780, 13782, 13784, 13786, 13788, 13790, 13792,
+    13795, 13797, 13799, 13802, 13805, 13807, 13809, 13811, 13813, 13815,
+    13817, 13819, 13821, 13823, 13826, 13828, 13831, 13833, 13836, 13838,
+    13840, 13842, 13845, 13847, 13849, 13852, 13855, 13857, 13859, 13861,
+    13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881,
+    13884, 13886, 13889, 13891, 13894, 13896, 13899, 13902, 13905, 13907,
+    13909, 13911, 13914, 13917, 13920, 13923, 13925, 13927, 13929, 13931,
+    13933, 13935, 13937, 13939, 13942, 13944, 13946, 13948, 13950, 13953,
+    13955, 13958, 13961, 13963, 13965, 13967, 13969, 13971, 13973, 13976,
+    13979, 13982, 13984, 13986, 13989, 13991, 13993, 13995, 13998, 14000,
+    14002, 14004, 14006, 14008, 14011, 14013, 14015, 14017, 14019, 14021,
+    14023, 14026, 14029, 14031, 14034, 14036, 14039, 14041, 14043, 14045,
+    14048, 14051, 14053, 14056, 14058, 14061, 14063, 14065, 14067, 14069,
+    14071, 14073, 14076, 14079, 14082, 14085, 14087, 14089, 14091, 14093,
+    14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14112, 14114,
+    14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134,
+    14136, 14139, 14142, 14145, 14147, 14149, 14151, 14153, 14156, 14158,
+    14161, 14163, 14165, 14168, 14171, 14173, 14175, 14177, 14179, 14181,
+    14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201,
+    14203, 14205, 14207, 14209, 14212, 14214, 14216, 14218, 14220, 14222,
+    14225, 14228, 14230, 14232, 14234, 14236, 14238, 14240, 14243, 14245,
+    14247, 14249, 14251, 14254, 14257, 14259, 14261, 14263, 14266, 14268,
+    14270, 14273, 14276, 14278, 14280, 14282, 14285, 14287, 14289, 14291,
+    14293, 14295, 14297, 14299, 14302, 14304, 14306, 14308, 14311, 14313,
+    14315, 14317, 14319, 14322, 14325, 14327, 14329, 14331, 14334, 14336,
+    14339, 14341, 14343, 14345, 14348, 14350, 14352, 14354, 14356, 14358,
+    14360, 14362, 14365, 14367, 14369, 14371, 14373, 14375, 14377, 14380,
+    14382, 14385, 14388, 14391, 14393, 14395, 14397, 14399, 14401, 14403,
+    14405, 14407, 0, 0,
 };
 
 /* NFC pairs */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
index 6cbcfa3de80..3e342d43278 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
@@ -115,6 +115,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
     /* XXX This hack belongs to the Tibetan shaper:
      * Reorder PADMA to ensure it comes after any vowel marks. */
     if (unlikely (unicode == 0x0FC6u)) return 254;
+    /* Reorder TSA -PHRU to reorder before U+0F74 */
+    if (unlikely (unicode == 0x0F39u)) return 127;
 
     return _hb_modified_combining_class[combining_class (unicode)];
   }
@@ -180,8 +182,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
         case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u);
         case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu);
         case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu,
-                                                            0x202Au, 0x202Eu,
-                                                            0x2060u, 0x206Fu);
+                                            0x202Au, 0x202Eu,
+                                            0x2060u, 0x206Fu);
         case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
         case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u);
         default: return false;
@@ -199,6 +201,50 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
     }
   }
 
+  /* Space estimates based on:
+   * http://www.unicode.org/charts/PDF/U2000.pdf
+   * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx
+   */
+  enum space_t {
+    NOT_SPACE = 0,
+    SPACE_EM   = 1,
+    SPACE_EM_2 = 2,
+    SPACE_EM_3 = 3,
+    SPACE_EM_4 = 4,
+    SPACE_EM_5 = 5,
+    SPACE_EM_6 = 6,
+    SPACE_EM_16 = 16,
+    SPACE_4_EM_18,      /* 4/18th of an EM! */
+    SPACE,
+    SPACE_FIGURE,
+    SPACE_PUNCTUATION,
+    SPACE_NARROW,
+  };
+  static inline space_t
+  space_fallback_type (hb_codepoint_t u)
+  {
+    switch (u)
+    {
+      /* All GC=Zs chars that can use a fallback. */
+      default:      return NOT_SPACE;   /* U+1680 OGHAM SPACE MARK */
+      case 0x0020u: return SPACE;       /* U+0020 SPACE */
+      case 0x00A0u: return SPACE;       /* U+00A0 NO-BREAK SPACE */
+      case 0x2000u: return SPACE_EM_2;  /* U+2000 EN QUAD */
+      case 0x2001u: return SPACE_EM;    /* U+2001 EM QUAD */
+      case 0x2002u: return SPACE_EM_2;  /* U+2002 EN SPACE */
+      case 0x2003u: return SPACE_EM;    /* U+2003 EM SPACE */
+      case 0x2004u: return SPACE_EM_3;  /* U+2004 THREE-PER-EM SPACE */
+      case 0x2005u: return SPACE_EM_4;  /* U+2005 FOUR-PER-EM SPACE */
+      case 0x2006u: return SPACE_EM_6;  /* U+2006 SIX-PER-EM SPACE */
+      case 0x2007u: return SPACE_FIGURE;        /* U+2007 FIGURE SPACE */
+      case 0x2008u: return SPACE_PUNCTUATION;   /* U+2008 PUNCTUATION SPACE */
+      case 0x2009u: return SPACE_EM_5;          /* U+2009 THIN SPACE */
+      case 0x200Au: return SPACE_EM_16;         /* U+200A HAIR SPACE */
+      case 0x202Fu: return SPACE_NARROW;        /* U+202F NARROW NO-BREAK SPACE */
+      case 0x205Fu: return SPACE_4_EM_18;       /* U+205F MEDIUM MATHEMATICAL SPACE */
+      case 0x3000u: return SPACE_EM;            /* U+3000 IDEOGRAPHIC SPACE */
+    }
+  }
 
   struct {
 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
@@ -299,10 +345,12 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
 #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
 
-/* Tibetan */
+/* Tibetan
+ * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ */
 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
 #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
 
 
 /* Misc */
@@ -313,5 +361,10 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
           FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
           FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
 
+#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
+        (FLAG_SAFE (gen_cat) & \
+         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+          FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
 
 #endif /* HB_UNICODE_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
index 4edb5fcd45b..99b2986e382 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
@@ -174,23 +174,23 @@ typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
 /*
  * just give me the best implementation you've got there.
  */
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_unicode_funcs_get_default (void);
 
 
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
 
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_unicode_funcs_get_empty (void);
 
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
 
-void
+HB_EXTERN void
 hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
                                 hb_user_data_key_t *key,
                                 void *              data,
@@ -198,18 +198,18 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
                                 hb_bool_t           replace);
 
 
-void *
+HB_EXTERN void *
 hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
                                 hb_user_data_key_t *key);
 
 
-void
+HB_EXTERN void
 hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs);
 
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
 hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
 
 
@@ -285,7 +285,7 @@ typedef unsigned int                    (*hb_unicode_decompose_compatibility_fun
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
                                            hb_unicode_combining_class_func_t func,
                                            void *user_data, hb_destroy_func_t destroy);
@@ -301,7 +301,7 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
                                            hb_unicode_eastasian_width_func_t func,
                                            void *user_data, hb_destroy_func_t destroy);
@@ -317,7 +317,7 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
                                             hb_unicode_general_category_func_t func,
                                             void *user_data, hb_destroy_func_t destroy);
@@ -333,7 +333,7 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
                                      hb_unicode_mirroring_func_t func,
                                      void *user_data, hb_destroy_func_t destroy);
@@ -349,7 +349,7 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
                                   hb_unicode_script_func_t func,
                                   void *user_data, hb_destroy_func_t destroy);
@@ -365,7 +365,7 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
                                    hb_unicode_compose_func_t func,
                                    void *user_data, hb_destroy_func_t destroy);
@@ -381,7 +381,7 @@ hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
                                      hb_unicode_decompose_func_t func,
                                      void *user_data, hb_destroy_func_t destroy);
@@ -397,7 +397,7 @@ hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
  *
  * Since: 0.9.2
  **/
-void
+HB_EXTERN void
 hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
                                                    hb_unicode_decompose_compatibility_func_t func,
                                                    void *user_data, hb_destroy_func_t destroy);
@@ -405,62 +405,63 @@ hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
 /* accessors */
 
 /**
+ * hb_unicode_combining_class:
+ *
  * Since: 0.9.2
  **/
-hb_unicode_combining_class_t
+HB_EXTERN hb_unicode_combining_class_t
 hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
                             hb_codepoint_t unicode);
 
 /**
+ * hb_unicode_eastasian_width:
+ *
  * Since: 0.9.2
  **/
-unsigned int
+HB_EXTERN unsigned int
 hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
                             hb_codepoint_t unicode);
 
 /**
+ * hb_unicode_general_category:
+ *
  * Since: 0.9.2
  **/
-hb_unicode_general_category_t
+HB_EXTERN hb_unicode_general_category_t
 hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
                              hb_codepoint_t unicode);
 
 /**
+ * hb_unicode_mirroring:
+ *
  * Since: 0.9.2
  **/
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
 hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
                       hb_codepoint_t unicode);
 
 /**
+ * hb_unicode_script:
+ *
  * Since: 0.9.2
  **/
-hb_script_t
+HB_EXTERN hb_script_t
 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
                    hb_codepoint_t unicode);
 
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
                     hb_codepoint_t      a,
                     hb_codepoint_t      b,
                     hb_codepoint_t     *ab);
 
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
                       hb_codepoint_t      ab,
                       hb_codepoint_t     *a,
                       hb_codepoint_t     *b);
 
-/**
- * Since: 0.9.2
- **/
-unsigned int
+HB_EXTERN unsigned int
 hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
                                     hb_codepoint_t      u,
                                     hb_codepoint_t     *decomposed);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
index 580bfd8ed14..a465842a3f0 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
@@ -146,11 +146,11 @@ struct hb_utf16_t
       return text;
     }
 
-    if (likely (hb_in_range (c, 0xD800u, 0xDBFFu)))
+    if (likely (c <= 0xDBFFu && text < end))
     {
       /* High-surrogate in c */
-      hb_codepoint_t l;
-      if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu))))
+      hb_codepoint_t l = *text;
+      if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
       {
         /* Low-surrogate in l */
         *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
@@ -170,8 +170,7 @@ struct hb_utf16_t
         hb_codepoint_t *unicode,
         hb_codepoint_t replacement)
   {
-    const uint16_t *end = text--;
-    hb_codepoint_t c = *text;
+    hb_codepoint_t c = *--text;
 
     if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
     {
@@ -179,14 +178,22 @@ struct hb_utf16_t
       return text;
     }
 
-    if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu)))
-      text--;
-
-    if (likely (next (text, end, unicode, replacement) == end))
-      return text;
+    if (likely (c >= 0xDC00u && start < text))
+    {
+      /* Low-surrogate in c */
+      hb_codepoint_t h = text[-1];
+      if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
+      {
+        /* High-surrogate in h */
+        *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+        text--;
+        return text;
+      }
+    }
 
+    /* Lonely / out-of-order surrogate. */
     *unicode = replacement;
-    return end - 1;
+    return text;
   }
 
 
@@ -211,14 +218,9 @@ struct hb_utf32_t
         hb_codepoint_t *unicode,
         hb_codepoint_t replacement)
   {
-    hb_codepoint_t c = *text++;
-    if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu)))
-      goto error;
-    *unicode = c;
-    return text;
-
-  error:
-    *unicode = replacement;
+    hb_codepoint_t c = *unicode = *text++;
+    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+      *unicode = replacement;
     return text;
   }
 
@@ -228,8 +230,10 @@ struct hb_utf32_t
         hb_codepoint_t *unicode,
         hb_codepoint_t replacement)
   {
-    next (text - 1, text, unicode, replacement);
-    return text - 1;
+    hb_codepoint_t c = *unicode = *--text;
+    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+      *unicode = replacement;
+    return text;
   }
 
   static inline unsigned int
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
index 16cf5e3fc4b..5bcd33c61a6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
@@ -37,25 +37,25 @@ HB_BEGIN_DECLS
 
 
 #define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 0
-#define HB_VERSION_MICRO 5
+#define HB_VERSION_MINOR 3
+#define HB_VERSION_MICRO 0
 
-#define HB_VERSION_STRING "1.0.5"
+#define HB_VERSION_STRING "1.3.0"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
         ((major)*10000+(minor)*100+(micro) <= \
          HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
 
 
-void
+HB_EXTERN void
 hb_version (unsigned int *major,
             unsigned int *minor,
             unsigned int *micro);
 
-const char *
+HB_EXTERN const char *
 hb_version_string (void);
 
-hb_bool_t
+HB_EXTERN hb_bool_t
 hb_version_atleast (unsigned int major,
                     unsigned int minor,
                     unsigned int micro);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
index c5a938a3818..7402034f437 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
@@ -28,6 +28,10 @@
 #define HB_H
 #define HB_H_IN
 
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
 #include "hb-blob.h"
 #include "hb-buffer.h"
 #include "hb-common.h"

From 88f2ad28aa275c1e07bbcad2fc0f1c9d39eebce7 Mon Sep 17 00:00:00 2001
From: Alexander Zvegintsev 
Date: Wed, 10 Aug 2016 02:50:58 +0300
Subject: [PATCH 051/115] 8155690: Update libPNG library to the latest
 up-to-date

Reviewed-by: serb
---
 .../native/libsplashscreen/libpng/CHANGES     | 154 ++++++++++-
 .../native/libsplashscreen/libpng/LICENSE     |  34 ++-
 .../native/libsplashscreen/libpng/README      |   2 +-
 .../share/native/libsplashscreen/libpng/png.c |  13 +-
 .../share/native/libsplashscreen/libpng/png.h | 253 +++++++++++++-----
 .../native/libsplashscreen/libpng/pngconf.h   |   4 +-
 .../native/libsplashscreen/libpng/pngdebug.h  |   2 +-
 .../native/libsplashscreen/libpng/pngerror.c  |   4 +-
 .../native/libsplashscreen/libpng/pngget.c    |  16 +-
 .../native/libsplashscreen/libpng/pnginfo.h   |   2 +-
 .../libsplashscreen/libpng/pnglibconf.h       |   6 +-
 .../native/libsplashscreen/libpng/pngmem.c    |   2 +-
 .../native/libsplashscreen/libpng/pngpread.c  |  19 +-
 .../native/libsplashscreen/libpng/pngpriv.h   |   7 +-
 .../native/libsplashscreen/libpng/pngread.c   | 156 ++++++-----
 .../native/libsplashscreen/libpng/pngrio.c    |   2 +-
 .../native/libsplashscreen/libpng/pngrtran.c  |  15 +-
 .../native/libsplashscreen/libpng/pngrutil.c  |   4 +-
 .../native/libsplashscreen/libpng/pngset.c    |  98 ++++++-
 .../native/libsplashscreen/libpng/pngstruct.h |   2 +-
 .../native/libsplashscreen/libpng/pngtest.c   |  15 +-
 .../native/libsplashscreen/libpng/pngtrans.c  |   2 +-
 .../native/libsplashscreen/libpng/pngwio.c    |   2 +-
 .../native/libsplashscreen/libpng/pngwrite.c  | 173 +++++++++++-
 .../native/libsplashscreen/libpng/pngwtran.c  |   2 +-
 .../native/libsplashscreen/libpng/pngwutil.c  | 100 +------
 26 files changed, 798 insertions(+), 291 deletions(-)

diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
index 8d9d53ee4e2..f7973c470a0 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
@@ -5088,7 +5088,8 @@ Version 1.6.15beta04 [November 4, 2014]
 Version 1.6.15beta05 [November 5, 2014]
   Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
     example.c, pngtest.c, and applications in the contrib directory.
-  Avoid out-of-bounds memory access in png_user_version_check().
+  Fixed an out-of-range read in png_user_version_check() (Bug report from
+    Qixue Xiao, CVE-2015-8540).
   Simplified and future-proofed png_user_version_check().
   Fixed GCC unsigned int->float warnings. Various versions of GCC
     seem to generate warnings when an unsigned value is implicitly
@@ -5446,7 +5447,7 @@ Version 1.6.20beta01 [November 20, 2015]
 Version 1.6.20beta02 [November 23, 2015]
   Fixed incorrect implementation of png_set_PLTE() that uses png_ptr
     not info_ptr, that left png_set_PLTE() open to the CVE-2015-8126
-    vulnerability.
+    vulnerability.  Fixes CVE-2015-8472.
 
 Version 1.6.20beta03 [November 24, 2015]
   Backported tests from libpng-1.7.0beta69.
@@ -5471,6 +5472,155 @@ Version 1.6.20rc02 [November 29, 2015]
 Version 1.6.20 [December 3, 2015]
   No changes.
 
+Version 1.6.21beta01 [December 11, 2015]
+  Fixed syntax "$(command)" in tests/pngstest that some shells other than
+    bash could not parse (Bug report by Nelson Beebe). Use `command` instead.
+
+Version 1.6.21beta02 [December 14, 2015]
+  Moved png_check_keyword() from pngwutil.c to pngset.c
+  Removed LE/BE dependencies in pngvalid, to 'fix' the current problem
+    in the BigEndian tests by not testing it, making the BE code the same 
+    as the LE version.
+  Fixes to pngvalid for various reduced build configurations (eliminate unused
+    statics) and a fix for the case in rgb_to_gray when the digitize option
+    reduces graylo to 0, producing a large error.
+
+Version 1.6.21beta03 [December 18, 2015]
+  Widened the 'limit' check on the internally calculated error limits in
+    the 'DIGITIZE' case (the code used prior to 1.7 for rgb_to_gray error
+    checks) and changed the check to only operate in non-release builds
+    (base build type not RC or RELEASE.)
+  Fixed undefined behavior in pngvalid.c, undefined because
+    (png_byte) << shift is undefined if it changes the signed bit
+    (because png_byte is promoted to int). The libpng exported functions
+    png_get_uint_32 and png_get_uint_16 handle this. (Bug reported by
+    David Drysdale as a result of reports from UBSAN in clang 3.8).
+  This changes pngvalid to use BE random numbers; this used to produce
+    errors but these should not be fixed as a result of the previous changes.
+
+Version 1.6.21rc01 [January 4, 2016]
+  In projects/vstudio, combined readme.txt and WARNING into README.txt
+
+Version 1.6.21rc02 [January 7, 2016]
+  Relocated assert() in contrib/tools/pngfix.c, bug found by American
+    Fuzzy Lop, reported by Brian Carpenter.
+  Marked 'limit' UNUSED in transform_range_check().  This only affects
+    release builds.
+
+Version 1.6.21 [January 15, 2016]
+  Worked around a false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta01 [January 23, 2016]
+  Changed PNG_USE_MKSTEMP to __COVERITY__ to select alternate
+    "tmpfile()" implementation in contrib/libtests/pngstest.c
+  Fixed NO_STDIO build of pngunknown.c to skip calling png_init_io()
+    if there is no stdio.h support.
+  Added a png_image_write_to_memory() API and a number of assist macros
+    to allow an application that uses the simplified API write to bypass
+    stdio and write directly to memory.
+  Added some warnings (png.h) and some check code to detect *possible*
+    overflow in the ROW_STRIDE and simplified image SIZE macros.  This
+    disallows image width/height/format that *might* overflow.  This is
+    a quiet API change that limits in-memory image size (uncompressed) to
+    less than 4GByte and image row size (stride) to less than 2GByte.
+  Revised workaround for false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta02 [February 8, 2016]
+  Only use exit(77) in configure builds.
+  Corrected error in PNG_IMAGE_PNG_SIZE_MAX. This new macro underreported
+    the palette size because it failed to take into account that the memory
+    palette has to be expanded to full RGB when it is written to PNG.
+  Updated CMakeLists.txt, added supporting scripts/gen*.cmake.in
+    and test.cmake.in (Roger Leigh).
+  Relaxed limit checks on gamma values in pngrtran.c. As suggested in
+    the comments gamma values outside the range currently permitted
+    by png_set_alpha_mode are useful for HDR data encoding.  These values
+    are already permitted by png_set_gamma so it is reasonable caution to
+    extend the png_set_alpha_mode range as HDR imaging systems are starting
+    to emerge.
+
+Version 1.6.22beta03 [March 9, 2016]
+  Added a common-law trademark notice and export control information
+    to the LICENSE file, png.h, and the man page.
+  Restored "& 0xff" in png_save_uint_16() and png_save_uint_32() that
+    were accidentally removed from libpng-1.6.17. 
+  Changed PNG_INFO_cHNK and PNG_FREE_cHNK from 0xnnnn to 0xnnnnU in png.h
+    (Robert C. Seacord).
+  Removed dubious "#if INT_MAX" test from png.h that was added to
+    libpng-1.6.19beta02 (John Bowler).
+  Add ${INCLUDES} in scripts/genout.cmake.in (Bug report by Nixon Kwok).
+  Updated LICENSE to say files in the contrib directory are not
+    necessarily under the libpng license, and that some makefiles have
+    other copyright owners.
+  Added INTEL-SSE2 support (Mike Klein and Matt Sarett, Google, Inc.).
+  Made contrib/libtests/timepng more robust.  The code no longer gives
+    up/fails on invalid PNG data, it just skips it (with error messages).
+    The code no longer fails on PNG files with data beyond IEND.  Options
+    exist to use png_read_png (reading the whole image, not by row) and, in
+    that case, to apply any of the supported transforms.  This makes for
+    more realistic testing; the decoded data actually gets used in a
+    meaningful fashion (John Bowler).
+  Fixed some misleading indentation (Krishnaraj Bhat).
+
+Version 1.6.22beta04 [April 5, 2016]
+  Force GCC compilation to C89 if needed (Dagobert Michelsen).
+  SSE filter speed improvements for bpp=3:
+    memcpy-free implementations of load3() / store3().
+    call load3() only when needed at the end of a scanline.
+
+Version 1.6.22beta05 [April 27, 2016]
+  Added PNG_FAST_FILTERS macro (defined as
+    PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP).
+  Various fixes for contrib/libtests/timepng.c
+  Moved INTEL-SSE code from pngpriv.h into contrib/intel/intel_sse.patch.
+  Fixed typo (missing underscore) in #define PNG_READ_16_TO_8_SUPPORTED
+    (Bug report by Y.Ohashik).
+
+Version 1.6.22beta06 [May 5, 2016]
+  Rebased contrib/intel_sse.patch.
+  Quieted two Coverity issues in contrib/libtests/timepng.c.
+  Fixed issues with scripts/genout.cmake.in (David Capello, Nixon Kwok):
+    Added support to use multiple directories in ZLIBINCDIR variable,
+    Fixed CMAKE_C_FLAGS with multiple values when genout is compiled on MSVC,
+    Fixed pnglibconf.c compilation on OS X including the sysroot path.
+
+Version 1.6.22rc01 [May 14, 2016]
+  No changes.
+
+Version 1.6.22rc02 [May 16, 2016]
+  Removed contrib/timepng from default build; it does not build on platforms
+    that don't supply clock_gettime().
+
+Version 1.6.22rc03 [May 17, 2016]
+  Restored contrib/timepng to default build but check for the presence
+    of clock_gettime() in configure.ac and Makefile.am.
+
+Version 1.6.22 [May 26, 2016]
+  No changes.
+
+Version 1.6.23beta01 [May 29, 2016]
+  Stop a potential memory leak in png_set_tRNS() (Bug report by Ted Ying).
+  Fixed the progressive reader to handle empty first IDAT chunk properly
+    (patch by Timothy Nikkel).  This bug was introduced in libpng-1.6.0 and
+    only affected the libpng16 branch.
+  Added tests in pngvalid.c to check zero-length IDAT chunks in various
+    positions.  Fixed the sequential reader to handle these more robustly
+    (John Bowler).
+
+Version 1.6.23rc01 [June 2, 2016]
+  Corrected progressive read input buffer in pngvalid.c. The previous version
+    the code invariably passed just one byte at a time to libpng.  The intent
+    was to pass a random number of bytes in the range 0..511.
+  Moved sse2 prototype from pngpriv.h to contrib/intel/intel_sse.patch.
+  Added missing ")" in pngerror.c (Matt Sarrett).
+
+Version 1.6.23rc02 [June 4, 2016]
+  Fixed undefined behavior in png_push_save_buffer(). Do not call
+    memcpy() with a null source, even if count is zero (Leon Scroggins III).
+
+Version 1.6.23 [June 9, 2016]
+  Fixed bad link to RFC2083 in png.5 (Nikola Forro).
+
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 (subscription required; visit
 https://lists.sourceforge.net/lists/listinfo/png-mng-implement
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
index 82dbe117f6d..b7ad4b9eaf3 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
@@ -10,8 +10,8 @@ this sentence.
 
 This code is released under the libpng license.
 
-libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
-Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
 derived from libpng-1.0.6, 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:
@@ -32,6 +32,10 @@ and with the following additions to the disclaimer:
    risk of satisfactory quality, performance, accuracy, and effort is with
    the user.
 
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
 libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
 Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
 libpng-0.96, and are distributed according to the same disclaimer and
@@ -55,6 +59,9 @@ Contributing Authors:
    Greg Roelofs
    Tom Tanner
 
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
 libpng versions 0.5, May 1995, through 0.88, January 1996, are
 Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
 
@@ -95,18 +102,29 @@ appreciated.
 
 END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
 
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
 
-   printf("%s", png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction.  However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
 
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
 
 Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is
 a certification mark of the Open Source Initiative. OSI has not addressed
 the additional disclaimers inserted at version 1.0.7.
 
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software.  See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
+
 Glenn Randers-Pehrson
 glennrp at users.sourceforge.net
-December 3, 2015
+June 9, 2016
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
index 59f1f918ae2..38e9a14f5c9 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.6.20 - December 3, 2015 (shared library 16.0)
+README for libpng version 1.6.23 - June 9, 2016 (shared library 16.0)
 See the note about version numbers near the top of png.h
 
 See INSTALL for instructions on how to install libpng.
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
index 38aa05942c9..f039ff71d90 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -42,7 +42,7 @@
 #include "pngpriv.h"
 
 /* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
 
 /* Tells libpng that we have already handled the first "num_bytes" bytes
  * of the PNG file signature.  If the PNG data is embedded into another
@@ -803,14 +803,15 @@ png_get_copyright(png_const_structrp png_ptr)
 #else
 #  ifdef __STDC__
    return PNG_STRING_NEWLINE \
-      "libpng version 1.6.20 - December 3, 2015" PNG_STRING_NEWLINE \
-      "Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
+      "libpng version 1.6.23 - June 9, 2016" PNG_STRING_NEWLINE \
+      "Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \
+      PNG_STRING_NEWLINE \
       "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
       "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
       PNG_STRING_NEWLINE;
 #  else
-   return "libpng version 1.6.20 - December 3, 2015\
-      Copyright (c) 1998-2015 Glenn Randers-Pehrson\
+   return "libpng version 1.6.23 - June 9, 2016\
+      Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\
       Copyright (c) 1996-1997 Andreas Dilger\
       Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
 #  endif
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
index c90a90f29cb..9f1ab421031 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
@@ -29,9 +29,9 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
  *
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -40,7 +40,7 @@
  * Authors and maintainers:
  *   libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
  *   libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
- *   libpng versions 0.97, January 1998, through 1.6.20, December 3, 2015:
+ *   libpng versions 0.97, January 1998, through 1.6.23, June 9, 2016:
  *     Glenn Randers-Pehrson.
  *   See also "Contributing Authors", below.
  */
@@ -53,8 +53,12 @@
  *
  * This code is released under the libpng license.
  *
- * libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
- * Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+ * Some files in the "contrib" directory and some configure-generated
+ * files that are distributed with libpng have other copyright owners and
+ * are released under other open source licenses.
+ *
+ * libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+ * Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
  * derived from libpng-1.0.6, 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:
@@ -75,6 +79,10 @@
  *    risk of satisfactory quality, performance, accuracy, and effort is with
  *    the user.
  *
+ * Some files in the "contrib" directory have other copyright owners and
+ * are released under other open source licenses.
+ *
+ *
  * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
  * Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
  * libpng-0.96, and are distributed according to the same disclaimer and
@@ -85,6 +93,9 @@
  *    Glenn Randers-Pehrson
  *    Willem van Schaik
  *
+ * Some files in the "scripts" directory have different copyright owners
+ * but are also released under this license.
+ *
  * libpng versions 0.89, June 1996, through 0.96, May 1997, are
  * Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
  * and are distributed according to the same disclaimer and license as
@@ -98,6 +109,9 @@
  *    Greg Roelofs
  *    Tom Tanner
  *
+ * Some files in the "scripts" directory have other copyright owners
+ * but are released under this license.
+ *
  * libpng versions 0.5, May 1995, through 0.88, January 1996, are
  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
  *
@@ -137,6 +151,29 @@
  * appreciated.
  *
  * END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
+ *
+ * TRADEMARK:
+ *
+ * The name "libpng" has not been registered by the Copyright owner
+ * as a trademark in any jurisdiction.  However, because libpng has
+ * been distributed and maintained world-wide, continually since 1995,
+ * the Copyright owner claims "common-law trademark protection" in any
+ * jurisdiction where common-law trademark is recognized.
+ *
+ * OSI CERTIFICATION:
+ *
+ * Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is
+ * a certification mark of the Open Source Initiative. OSI has not addressed
+ * the additional disclaimers inserted at version 1.0.7.
+ *
+ * EXPORT CONTROL:
+ *
+ * The Copyright owner believes that the Export Control Classification
+ * Number (ECCN) for libpng is EAR99, which means not subject to export
+ * controls or International Traffic in Arms Regulations (ITAR) because
+ * it is open source, publicly available software, that does not contain
+ * any encryption software.  See the EAR, paragraphs 734.3(b)(3) and
+ * 734.7(b).
  */
 
 /*
@@ -149,12 +186,6 @@
  * 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. OSI has not addressed
- * the additional disclaimers inserted at version 1.0.7.
- */
-
 /*
  * The contributing authors would like to thank all those who helped
  * with testing, bug fixes, and patience.  This wouldn't have been
@@ -210,11 +241,11 @@
  *    ...
  *    1.0.19                  10    10019  10.so.0.19[.0]
  *    ...
- *    1.2.53                  13    10253  12.so.0.53[.0]
+ *    1.2.56                  13    10256  12.so.0.56[.0]
  *    ...
- *    1.5.23                  15    10523  15.so.15.23[.0]
+ *    1.5.27                  15    10527  15.so.15.27[.0]
  *    ...
- *    1.6.20                  16    10620  16.so.16.20[.0]
+ *    1.6.23                  16    10623  16.so.16.23[.0]
  *
  *    Henceforth the source version will match the shared-library major
  *    and minor numbers; the shared-library major version number will be
@@ -242,13 +273,13 @@
  * Y2K compliance in libpng:
  * =========================
  *
- *    December 3, 2015
+ *    June 9, 2016
  *
  *    Since the PNG Development group is an ad-hoc body, we can't make
  *    an official declaration.
  *
  *    This is your unofficial assurance that libpng from version 0.71 and
- *    upward through 1.6.20 are Y2K compliant.  It is my belief that
+ *    upward through 1.6.23 are Y2K compliant.  It is my belief that
  *    earlier versions were also Y2K compliant.
  *
  *    Libpng only has two year fields.  One is a 2-byte unsigned integer
@@ -310,9 +341,9 @@
  */
 
 /* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.20"
+#define PNG_LIBPNG_VER_STRING "1.6.23"
 #define PNG_HEADER_VERSION_STRING \
-     " libpng version 1.6.20 - December 3, 2015\n"
+     " libpng version 1.6.23 - June 9, 2016\n"
 
 #define PNG_LIBPNG_VER_SONUM   16
 #define PNG_LIBPNG_VER_DLLNUM  16
@@ -320,7 +351,7 @@
 /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
 #define PNG_LIBPNG_VER_MAJOR   1
 #define PNG_LIBPNG_VER_MINOR   6
-#define PNG_LIBPNG_VER_RELEASE 20
+#define PNG_LIBPNG_VER_RELEASE 23
 
 /* This should match the numeric part of the final component of
  * PNG_LIBPNG_VER_STRING, omitting any leading zero:
@@ -351,7 +382,7 @@
  * version 1.0.0 was mis-numbered 100 instead of 10000).  From
  * version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release
  */
-#define PNG_LIBPNG_VER 10620 /* 1.6.20 */
+#define PNG_LIBPNG_VER 10623 /* 1.6.23 */
 
 /* Library configuration: these options cannot be changed after
  * the library has been built.
@@ -461,7 +492,7 @@ extern "C" {
 /* This triggers a compiler error in png.c, if png.c and png.h
  * do not agree upon the version number.
  */
-typedef char* png_libpng_version_1_6_20;
+typedef char* png_libpng_version_1_6_23;
 
 /* Basic control structions.  Read libpng-manual.txt or libpng.3 for more info.
  *
@@ -762,24 +793,22 @@ typedef png_unknown_chunk * * png_unknown_chunkpp;
  * data in the info_struct to be written into the output file.  The values
  * of the PNG_INFO_ defines should NOT be changed.
  */
-#define PNG_INFO_gAMA 0x0001
-#define PNG_INFO_sBIT 0x0002
-#define PNG_INFO_cHRM 0x0004
-#define PNG_INFO_PLTE 0x0008
-#define PNG_INFO_tRNS 0x0010
-#define PNG_INFO_bKGD 0x0020
-#define PNG_INFO_hIST 0x0040
-#define PNG_INFO_pHYs 0x0080
-#define PNG_INFO_oFFs 0x0100
-#define PNG_INFO_tIME 0x0200
-#define PNG_INFO_pCAL 0x0400
-#define PNG_INFO_sRGB 0x0800   /* GR-P, 0.96a */
-#define PNG_INFO_iCCP 0x1000   /* ESR, 1.0.6 */
-#define PNG_INFO_sPLT 0x2000   /* ESR, 1.0.6 */
-#define PNG_INFO_sCAL 0x4000   /* ESR, 1.0.6 */
-#if INT_MAX >= 0x8000 /* else this might break */
-#define PNG_INFO_IDAT 0x8000   /* ESR, 1.0.6 */
-#endif
+#define PNG_INFO_gAMA 0x0001U
+#define PNG_INFO_sBIT 0x0002U
+#define PNG_INFO_cHRM 0x0004U
+#define PNG_INFO_PLTE 0x0008U
+#define PNG_INFO_tRNS 0x0010U
+#define PNG_INFO_bKGD 0x0020U
+#define PNG_INFO_hIST 0x0040U
+#define PNG_INFO_pHYs 0x0080U
+#define PNG_INFO_oFFs 0x0100U
+#define PNG_INFO_tIME 0x0200U
+#define PNG_INFO_pCAL 0x0400U
+#define PNG_INFO_sRGB 0x0800U  /* GR-P, 0.96a */
+#define PNG_INFO_iCCP 0x1000U  /* ESR, 1.0.6 */
+#define PNG_INFO_sPLT 0x2000U  /* ESR, 1.0.6 */
+#define PNG_INFO_sCAL 0x4000U  /* ESR, 1.0.6 */
+#define PNG_INFO_IDAT 0x8000U  /* ESR, 1.0.6 */
 
 /* This is used for the transformation routines, as some of them
  * change these values for the row.  It also should enable using
@@ -1350,7 +1379,7 @@ PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));
 #endif
 
 #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
-#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
+#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */
 /* Strip the second byte of information from a 16-bit depth file. */
 PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
 #endif
@@ -1501,8 +1530,8 @@ PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
 #define PNG_FILTER_UP      0x20
 #define PNG_FILTER_AVG     0x40
 #define PNG_FILTER_PAETH   0x80
-#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
-                         PNG_FILTER_AVG | PNG_FILTER_PAETH)
+#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP)
+#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH)
 
 /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
  * These defines should NOT be changed.
@@ -1779,21 +1808,21 @@ PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
 #define PNG_SET_WILL_FREE_DATA 1
 #define PNG_USER_WILL_FREE_DATA 2
 /* Flags for png_ptr->free_me and info_ptr->free_me */
-#define PNG_FREE_HIST 0x0008
-#define PNG_FREE_ICCP 0x0010
-#define PNG_FREE_SPLT 0x0020
-#define PNG_FREE_ROWS 0x0040
-#define PNG_FREE_PCAL 0x0080
-#define PNG_FREE_SCAL 0x0100
+#define PNG_FREE_HIST 0x0008U
+#define PNG_FREE_ICCP 0x0010U
+#define PNG_FREE_SPLT 0x0020U
+#define PNG_FREE_ROWS 0x0040U
+#define PNG_FREE_PCAL 0x0080U
+#define PNG_FREE_SCAL 0x0100U
 #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
-#  define PNG_FREE_UNKN 0x0200
+#  define PNG_FREE_UNKN 0x0200U
 #endif
-/*      PNG_FREE_LIST 0x0400    removed in 1.6.0 because it is ignored */
-#define PNG_FREE_PLTE 0x1000
-#define PNG_FREE_TRNS 0x2000
-#define PNG_FREE_TEXT 0x4000
-#define PNG_FREE_ALL  0x7fff
-#define PNG_FREE_MUL  0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
+/*      PNG_FREE_LIST 0x0400U   removed in 1.6.0 because it is ignored */
+#define PNG_FREE_PLTE 0x1000U
+#define PNG_FREE_TRNS 0x2000U
+#define PNG_FREE_TEXT 0x4000U
+#define PNG_FREE_ALL  0x7fffU
+#define PNG_FREE_MUL  0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
 
 #ifdef PNG_USER_MEM_SUPPORTED
 PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
@@ -2917,12 +2946,19 @@ typedef struct
     * is the minimum 'row stride', the minimum count of components between each
     * row.  For a color-mapped image this is the minimum number of bytes in a
     * row.
+    *
+    * WARNING: this macro overflows for some images with more than one component
+    * and very large image widths.  libpng will refuse to process an image where
+    * this macro would overflow.
     */
 
 #define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
    (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
    /* Return the size, in bytes, of an image buffer given a png_image and a row
     * stride - the number of components to leave space for in each row.
+    *
+    * WARNING: this macro overflows a 32-bit integer for some large PNG images,
+    * libpng will refuse to process an image where such an overflow would occur.
     */
 
 #define PNG_IMAGE_SIZE(image)\
@@ -3043,7 +3079,6 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
 #endif /* SIMPLIFIED_READ */
 
 #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-#ifdef PNG_STDIO_SUPPORTED
 /* WRITE APIS
  * ----------
  * For write you must initialize a png_image structure to describe the image to
@@ -3060,6 +3095,7 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
  *    values do not correspond to the colors in sRGB.
  * colormap_entries: set to the number of entries in the color-map (0 to 256)
  */
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
 PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
    const char *file, int convert_to_8bit, const void *buffer,
    png_int_32 row_stride, const void *colormap));
@@ -3069,8 +3105,9 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
    int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
    const void *colormap));
    /* Write the image to the given (FILE*). */
+#endif /* SIMPLIFIED_WRITE_STDIO */
 
-/* With both write APIs if image is in one of the linear formats with 16-bit
+/* With all write APIs if image is in one of the linear formats with 16-bit
  * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
  * gamma encoded according to the sRGB specification, otherwise a 16-bit linear
  * encoded PNG file is written.
@@ -3082,13 +3119,103 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
  *
  * With all APIs row_stride is handled as in the read APIs - it is the spacing
  * from one row to the next in component sized units (1 or 2 bytes) and if
- * negative indicates a bottom-up row layout in the buffer.  If row_stride is zero,
- * libpng will calculate it for you from the image width and number of channels.
+ * negative indicates a bottom-up row layout in the buffer.  If row_stride is
+ * zero, libpng will calculate it for you from the image width and number of
+ * channels.
  *
- * Note that the write API does not support interlacing, sub-8-bit pixels, indexed
- * PNG (color_type 3) or most ancillary chunks.
+ * Note that the write API does not support interlacing, sub-8-bit pixels or
+ * most ancillary chunks.  If you need to write text chunks (e.g. for copyright
+ * notices) you need to use one of the other APIs.
  */
-#endif /* STDIO */
+
+PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
+   png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8_bit,
+   const void *buffer, png_int_32 row_stride, const void *colormap));
+   /* Write the image to the given memory buffer.  The function both writes the
+    * whole PNG data stream to *memory and updates *memory_bytes with the count
+    * of bytes written.
+    *
+    * 'memory' may be NULL.  In this case *memory_bytes is not read however on
+    * success the number of bytes which would have been written will still be
+    * stored in *memory_bytes.  On failure *memory_bytes will contain 0.
+    *
+    * If 'memory' is not NULL it must point to memory[*memory_bytes] of
+    * writeable memory.
+    *
+    * If the function returns success memory[*memory_bytes] (if 'memory' is not
+    * NULL) contains the written PNG data.  *memory_bytes will always be less
+    * than or equal to the original value.
+    *
+    * If the function returns false and *memory_bytes was not changed an error
+    * occured during write.  If *memory_bytes was changed, or is not 0 if
+    * 'memory' was NULL, the write would have succeeded but for the memory
+    * buffer being too small.  *memory_bytes contains the required number of
+    * bytes and will be bigger that the original value.
+    */
+
+#define png_image_write_get_memory_size(image, size, convert_to_8_bit, buffer,\
+   row_stride, colormap)\
+   png_image_write_to_memory(&(image), 0, &(size), convert_to_8_bit, buffer,\
+         row_stride, colormap)
+   /* Return the amount of memory in 'size' required to compress this image.
+    * The png_image structure 'image' must be filled in as in the above
+    * function and must not be changed before the actual write call, the buffer
+    * and all other parameters must also be identical to that in the final
+    * write call.  The 'size' variable need not be initialized.
+    *
+    * NOTE: the macro returns true/false, if false is returned 'size' will be
+    * set to zero and the write failed and probably will fail if tried again.
+    */
+
+/* You can pre-allocate the buffer by making sure it is of sufficient size
+ * regardless of the amount of compression achieved.  The buffer size will
+ * always be bigger than the original image and it will never be filled.  The
+ * following macros are provided to assist in allocating the buffer.
+ */
+#define PNG_IMAGE_DATA_SIZE(image) (PNG_IMAGE_SIZE(image)+(image).height)
+   /* The number of uncompressed bytes in the PNG byte encoding of the image;
+    * uncompressing the PNG IDAT data will give this number of bytes.
+    *
+    * NOTE: while PNG_IMAGE_SIZE cannot overflow for an image in memory this
+    * macro can because of the extra bytes used in the PNG byte encoding.  You
+    * need to avoid this macro if your image size approaches 2^30 in width or
+    * height.  The same goes for the remainder of these macros; they all produce
+    * bigger numbers than the actual in-memory image size.
+    */
+#ifndef PNG_ZLIB_MAX_SIZE
+#  define PNG_ZLIB_MAX_SIZE(b) ((b)+(((b)+7U)>>3)+(((b)+63U)>>6)+11U)
+   /* An upper bound on the number of compressed bytes given 'b' uncompressed
+    * bytes.  This is based on deflateBounds() in zlib; different
+    * implementations of zlib compression may conceivably produce more data so
+    * if your zlib implementation is not zlib itself redefine this macro
+    * appropriately.
+    */
+#endif
+
+#define PNG_IMAGE_COMPRESSED_SIZE_MAX(image)\
+   PNG_ZLIB_MAX_SIZE((png_alloc_size_t)PNG_IMAGE_DATA_SIZE(image))
+   /* An upper bound on the size of the data in the PNG IDAT chunks. */
+
+#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\
+   ((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\
+    (((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\
+     12U+3U*(image).colormap_entries/*PLTE data*/+\
+     (((image).format&PNG_FORMAT_FLAG_ALPHA)?\
+      12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
+    12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))
+   /* A helper for the following macro; if your compiler cannot handle the
+    * following macro use this one with the result of
+    * PNG_IMAGE_COMPRESSED_SIZE_MAX(image) as the second argument (most
+    * compilers should handle this just fine.)
+    */
+
+#define PNG_IMAGE_PNG_SIZE_MAX(image)\
+   PNG_IMAGE_PNG_SIZE_MAX_(image, PNG_IMAGE_COMPRESSED_SIZE_MAX(image))
+   /* An upper bound on the total length of the PNG data stream for 'image'.
+    * The result is of type png_alloc_size_t, on 32-bit systems this may
+    * overflow even though PNG_IMAGE_DATA_SIZE does not overflow; the write will
+    * run out of buffer space but return a corrected size which should work.
+    */
 #endif /* SIMPLIFIED_WRITE */
 /*******************************************************************************
  *  END OF SIMPLIFIED API
@@ -3146,7 +3273,7 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
  * one to use is one more than this.)
  */
 #ifdef PNG_EXPORT_LAST_ORDINAL
-  PNG_EXPORT_LAST_ORDINAL(244);
+  PNG_EXPORT_LAST_ORDINAL(245);
 #endif
 
 #ifdef __cplusplus
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
index 482dcf7daef..fd35b2a757b 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
@@ -29,9 +29,9 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
  *
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
index d30815032c7..f65bb8a3e0f 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.8 [December 19, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
index 7ab1cfeeb7e..920935a0f02 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -72,7 +72,7 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message),
    if (png_ptr != NULL)
    {
       if ((png_ptr->flags &
-         (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
+         (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
       {
          if (*error_message == PNG_LITERAL_SHARP)
          {
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
index a2c9d3a8a4c..3b3fe19ca38 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -484,11 +484,11 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
    return (retval);
 }
 #endif /* pHYs */
-#endif  /* INCH_CONVERSIONS */
+#endif /* INCH_CONVERSIONS */
 
 /* png_get_channels really belongs in here, too, but it's been around longer */
 
-#endif  /* EASY_ACCESS */
+#endif /* EASY_ACCESS */
 
 
 png_byte PNGAPI
@@ -1170,19 +1170,19 @@ png_get_compression_buffer_size(png_const_structrp png_ptr)
       return 0;
 
 #ifdef PNG_WRITE_SUPPORTED
-      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
 #endif
    {
 #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
-         return png_ptr->IDAT_read_size;
+      return png_ptr->IDAT_read_size;
 #else
-         return PNG_IDAT_READ_SIZE;
+      return PNG_IDAT_READ_SIZE;
 #endif
    }
 
 #ifdef PNG_WRITE_SUPPORTED
-      else
-         return png_ptr->zbuffer_size;
+   else
+      return png_ptr->zbuffer_size;
 #endif
 }
 
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
index ff350824430..1dbf785cd08 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.1 [March 28, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
index bcb167e7aa7..bd14d6e2056 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
@@ -27,16 +27,15 @@
 /* libpng STANDARD API DEFINITION */
 
 /* pnglibconf.h - library build configuration */
-
 /* This file is available under and governed by the GNU General Public
  * License version 2 only, as published by the Free Software Foundation.
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  */
 
-/* libpng version 1.6.20, December 3, 2015 */
+/* libpng version 1.6.23, June 9, 2016 */
 
-/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2016 Glenn Randers-Pehrson */
 
 /* This code is released under the libpng license. */
 /* For conditions of distribution and use, see the disclaimer */
@@ -141,6 +140,7 @@
 #define PNG_SIMPLIFIED_READ_SUPPORTED
 /*#undef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED*/
 /*#undef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED*/
+/*#undef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED*/
 /*#undef PNG_SIMPLIFIED_WRITE_SUPPORTED*/
 #define PNG_STDIO_SUPPORTED
 #define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
index 71c6956b79f..967611f968f 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
index e17c993a2ff..289e94ce239 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -238,12 +238,14 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
           (png_ptr->mode & PNG_HAVE_PLTE) == 0)
          png_error(png_ptr, "Missing PLTE before IDAT");
 
-      png_ptr->mode |= PNG_HAVE_IDAT;
       png_ptr->process_mode = PNG_READ_IDAT_MODE;
 
-      if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
-         if (png_ptr->push_length == 0)
-            return;
+      if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+         if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
+            if (png_ptr->push_length == 0)
+               return;
+
+      png_ptr->mode |= PNG_HAVE_IDAT;
 
       if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
          png_benign_error(png_ptr, "Too many IDATs found");
@@ -527,7 +529,10 @@ png_push_save_buffer(png_structrp png_ptr)
          png_error(png_ptr, "Insufficient memory for save_buffer");
       }
 
-      memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+      if (old_buffer)
+         memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+      else if (png_ptr->save_buffer_size)
+         png_error(png_ptr, "save_buffer error");
       png_free(png_ptr, old_buffer);
       png_ptr->save_buffer_max = new_max;
    }
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
index f5c1532af51..05ed1eb7151 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -1945,6 +1945,9 @@ PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
 #endif
 
+PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
+   png_const_charp key, png_bytep new_key), PNG_EMPTY);
+
 /* Maintainer: Put new private prototypes here ^ */
 
 #include "pngdebug.h"
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
index 69d5be24367..8650556a9cf 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -155,7 +155,10 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
       }
 
       else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+      {
+         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
          png_ptr->mode |= PNG_AFTER_IDAT;
+      }
 
       /* This should be a binary subdivision search or a hash for
        * matching the chunk name rather than a linear search.
@@ -813,6 +816,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
       png_uint_32 length = png_read_chunk_header(png_ptr);
       png_uint_32 chunk_name = png_ptr->chunk_name;
 
+      if (chunk_name != png_IDAT)
+         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+
       if (chunk_name == png_IEND)
          png_handle_IEND(png_ptr, info_ptr, length);
 
@@ -827,9 +833,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
       {
          if (chunk_name == png_IDAT)
          {
-            if ((length > 0) ||
-                (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
-               png_benign_error(png_ptr, "Too many IDATs found");
+            if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+                || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+               png_benign_error(png_ptr, ".Too many IDATs found");
          }
          png_handle_unknown(png_ptr, info_ptr, length, keep);
          if (chunk_name == png_PLTE)
@@ -840,10 +846,14 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
       else if (chunk_name == png_IDAT)
       {
          /* Zero length IDATs are legal after the last IDAT has been
-          * read, but not after other chunks have been read.
+          * read, but not after other chunks have been read.  1.6 does not
+          * always read all the deflate data; specifically it cannot be relied
+          * upon to read the Adler32 at the end.  If it doesn't ignore IDAT
+          * chunks which are longer than zero as well:
           */
-         if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
-            png_benign_error(png_ptr, "Too many IDATs found");
+         if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+             || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+            png_benign_error(png_ptr, "..Too many IDATs found");
 
          png_crc_finish(png_ptr, length);
       }
@@ -3876,16 +3886,16 @@ png_image_read_direct(png_voidp argument)
             else
                filler = 255;
 
-#           ifdef PNG_FORMAT_AFIRST_SUPPORTED
-               if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
-               {
-                  where = PNG_FILLER_BEFORE;
-                  change &= ~PNG_FORMAT_FLAG_AFIRST;
-               }
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
+            if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+            {
+               where = PNG_FILLER_BEFORE;
+               change &= ~PNG_FORMAT_FLAG_AFIRST;
+            }
 
-               else
-#           endif
-               where = PNG_FILLER_AFTER;
+            else
+#endif
+            where = PNG_FILLER_AFTER;
 
             png_set_add_alpha(png_ptr, filler, where);
          }
@@ -3993,12 +4003,12 @@ png_image_read_direct(png_voidp argument)
       if (info_ptr->bit_depth == 16)
          info_format |= PNG_FORMAT_FLAG_LINEAR;
 
-#     ifdef PNG_FORMAT_BGR_SUPPORTED
-         if ((png_ptr->transformations & PNG_BGR) != 0)
-            info_format |= PNG_FORMAT_FLAG_BGR;
-#     endif
+#ifdef PNG_FORMAT_BGR_SUPPORTED
+      if ((png_ptr->transformations & PNG_BGR) != 0)
+         info_format |= PNG_FORMAT_FLAG_BGR;
+#endif
 
-#     ifdef PNG_FORMAT_AFIRST_SUPPORTED
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
          if (do_local_background == 2)
          {
             if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
@@ -4099,58 +4109,84 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
 {
    if (image != NULL && image->version == PNG_IMAGE_VERSION)
    {
-      png_uint_32 check;
+      /* Check for row_stride overflow.  This check is not performed on the
+       * original PNG format because it may not occur in the output PNG format
+       * and libpng deals with the issues of reading the original.
+       */
+      const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
 
-      if (row_stride == 0)
-         row_stride = PNG_IMAGE_ROW_STRIDE(*image);
-
-      if (row_stride < 0)
-         check = -row_stride;
-
-      else
-         check = row_stride;
-
-      if (image->opaque != NULL && buffer != NULL &&
-         check >= PNG_IMAGE_ROW_STRIDE(*image))
+      if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
       {
-         if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
-            (image->colormap_entries > 0 && colormap != NULL))
+         png_uint_32 check;
+         const png_uint_32 png_row_stride = image->width * channels;
+
+         if (row_stride == 0)
+            row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+         if (row_stride < 0)
+            check = -row_stride;
+
+         else
+            check = row_stride;
+
+         if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
          {
-            int result;
-            png_image_read_control display;
-
-            memset(&display, 0, (sizeof display));
-            display.image = image;
-            display.buffer = buffer;
-            display.row_stride = row_stride;
-            display.colormap = colormap;
-            display.background = background;
-            display.local_row = NULL;
-
-            /* Choose the correct 'end' routine; for the color-map case all the
-             * setup has already been done.
+            /* Now check for overflow of the image buffer calculation; this
+             * limits the whole image size to 32 bits for API compatibility with
+             * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
              */
-            if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
-               result =
-                  png_safe_execute(image, png_image_read_colormap, &display) &&
-                  png_safe_execute(image, png_image_read_colormapped, &display);
+            if (image->height <= 0xFFFFFFFF/png_row_stride)
+            {
+               if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
+                  (image->colormap_entries > 0 && colormap != NULL))
+               {
+                  int result;
+                  png_image_read_control display;
+
+                  memset(&display, 0, (sizeof display));
+                  display.image = image;
+                  display.buffer = buffer;
+                  display.row_stride = row_stride;
+                  display.colormap = colormap;
+                  display.background = background;
+                  display.local_row = NULL;
+
+                  /* Choose the correct 'end' routine; for the color-map case
+                   * all the setup has already been done.
+                   */
+                  if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
+                     result = png_safe_execute(image,
+                                    png_image_read_colormap, &display) &&
+                              png_safe_execute(image,
+                                    png_image_read_colormapped, &display);
+
+                  else
+                     result =
+                        png_safe_execute(image,
+                              png_image_read_direct, &display);
+
+                  png_image_free(image);
+                  return result;
+               }
+
+               else
+                  return png_image_error(image,
+                     "png_image_finish_read[color-map]: no color-map");
+            }
 
             else
-               result =
-                  png_safe_execute(image, png_image_read_direct, &display);
-
-            png_image_free(image);
-            return result;
+               return png_image_error(image,
+                  "png_image_finish_read: image too large");
          }
 
          else
             return png_image_error(image,
-               "png_image_finish_read[color-map]: no color-map");
+               "png_image_finish_read: invalid argument");
       }
 
       else
          return png_image_error(image,
-            "png_image_finish_read: invalid argument");
+            "png_image_finish_read: row_stride too large");
    }
 
    else if (image != NULL)
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
index b72cafd328a..0ac5c4b0b4d 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
index b6b731d0176..51585b02fde 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -187,7 +187,7 @@ png_set_background(png_structrp png_ptr,
    png_set_background_fixed(png_ptr, background_color, background_gamma_code,
       need_expand, png_fixed(png_ptr, background_gamma, "png_set_background"));
 }
-#  endif  /* FLOATING_POINT */
+#  endif /* FLOATING_POINT */
 #endif /* READ_BACKGROUND */
 
 /* Scale 16-bit depth files to 8-bit depth.  If both of these are set then the
@@ -317,9 +317,12 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
     * is expected to be 1 or greater, but this range test allows for some
     * viewing correction values.  The intent is to weed out users of this API
     * who use the inverse of the gamma value accidentally!  Since some of these
-    * values are reasonable this may have to be changed.
+    * values are reasonable this may have to be changed:
+    *
+    * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit
+    * gamma of 36, and its reciprocal.)
     */
-   if (output_gamma < 70000 || output_gamma > 300000)
+   if (output_gamma < 1000 || output_gamma > 10000000)
       png_error(png_ptr, "output gamma out of expected range");
 
    /* The default file gamma is the inverse of the output gamma; the output
@@ -1940,7 +1943,7 @@ png_init_read_transformations(png_structrp png_ptr)
             png_ptr->palette[i].blue = (png_byte)component;
          }
    }
-#endif  /* READ_SHIFT */
+#endif /* READ_SHIFT */
 }
 
 /* Modify the info structure to reflect the transformations.  The
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
index a2e58468a68..6722f3b7165 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.20 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.20 [December 3, 2014]
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
index 748008eb70b..a610db6c78a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -980,12 +980,14 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
 
        png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
 
-       /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
-       png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep,
-         png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
-
        if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
+       {
+         /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
+          info_ptr->trans_alpha = png_voidcast(png_bytep,
+             png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
           memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
+       }
+       png_ptr->trans_alpha = info_ptr->trans_alpha;
    }
 
    if (trans_color != NULL)
@@ -1672,4 +1674,88 @@ png_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
       png_ptr->num_palette_max = -1;
 }
 #endif
+
+#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \
+    defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
+/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
+ * and if invalid, correct the keyword rather than discarding the entire
+ * chunk.  The PNG 1.0 specification requires keywords 1-79 characters in
+ * length, forbids leading or trailing whitespace, multiple internal spaces,
+ * and the non-break space (0x80) from ISO 8859-1.  Returns keyword length.
+ *
+ * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
+ * trailing '\0').  If this routine returns 0 then there was no keyword, or a
+ * valid one could not be generated, and the caller must png_error.
+ */
+png_uint_32 /* PRIVATE */
+png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
+{
+   png_const_charp orig_key = key;
+   png_uint_32 key_len = 0;
+   int bad_character = 0;
+   int space = 1;
+
+   png_debug(1, "in png_check_keyword");
+
+   if (key == NULL)
+   {
+      *new_key = 0;
+      return 0;
+   }
+
+   while (*key && key_len < 79)
+   {
+      png_byte ch = (png_byte)*key++;
+
+      if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
+         *new_key++ = ch, ++key_len, space = 0;
+
+      else if (space == 0)
+      {
+         /* A space or an invalid character when one wasn't seen immediately
+          * before; output just a space.
+          */
+         *new_key++ = 32, ++key_len, space = 1;
+
+         /* If the character was not a space then it is invalid. */
+         if (ch != 32)
+            bad_character = ch;
+      }
+
+      else if (bad_character == 0)
+         bad_character = ch; /* just skip it, record the first error */
+   }
+
+   if (key_len > 0 && space != 0) /* trailing space */
+   {
+      --key_len, --new_key;
+      if (bad_character == 0)
+         bad_character = 32;
+   }
+
+   /* Terminate the keyword */
+   *new_key = 0;
+
+   if (key_len == 0)
+      return 0;
+
+#ifdef PNG_WARNINGS_SUPPORTED
+   /* Try to only output one warning per keyword: */
+   if (*key != 0) /* keyword too long */
+      png_warning(png_ptr, "keyword truncated");
+
+   else if (bad_character != 0)
+   {
+      PNG_WARNING_PARAMETERS(p)
+
+      png_warning_parameter(p, 1, orig_key);
+      png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
+
+      png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
+   }
+#endif /* WARNINGS */
+
+   return key_len;
+}
+#endif /* TEXT || pCAL || iCCP || sPLT */
 #endif /* READ || WRITE */
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
index e47c02d6fa6..ae72f32a963 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
index ef3a4ab0e50..399e67fe8db 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.5.25 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -71,6 +71,15 @@
 
 #include "png.h"
 
+/* 1.6.1 added support for the configure test harness, which uses 77 to indicate
+ * a skipped test, in earlier versions we need to succeed on a skipped test, so:
+ */
+#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)
+#  define SKIP 77
+#else
+#  define SKIP 0
+#endif
+
 /* Known chunks that exist in pngtest.png must be supported or pngtest will fail
  * simply as a result of re-ordering them.  This may be fixed in 1.7
  *
@@ -2093,9 +2102,9 @@ main(void)
    fprintf(STDERR,
       " test ignored because libpng was not built with read support\n");
    /* And skip this test */
-   return PNG_LIBPNG_VER < 10600 ? 0 : 77;
+   return SKIP;
 }
 #endif
 
 /* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
index d6016df53ec..e2d11b0ba8a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
index 7268523c3f9..ea5f59556d9 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
index d7d751d36fe..6dfb3c2578a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -40,9 +40,9 @@
  */
 
 #include "pngpriv.h"
-#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
 #  include 
-#endif
+#endif /* SIMPLIFIED_WRITE_STDIO */
 
 #ifdef PNG_WRITE_SUPPORTED
 
@@ -1480,7 +1480,6 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
 
 
 #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-# ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
 /* Initialize the write structure - general purpose utility. */
 static int
 png_image_write_init(png_imagep image)
@@ -1532,6 +1531,10 @@ typedef struct
    png_const_voidp first_row;
    ptrdiff_t       row_bytes;
    png_voidp       local_row;
+   /* Byte count for memory writing */
+   png_bytep        memory;
+   png_alloc_size_t memory_bytes; /* not used for STDIO */
+   png_alloc_size_t output_bytes; /* running total */
 } png_image_write_control;
 
 /* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to
@@ -1959,9 +1962,43 @@ png_image_write_main(png_voidp argument)
       png_set_benign_errors(png_ptr, 0/*error*/);
 #   endif
 
-   /* Default the 'row_stride' parameter if required. */
-   if (display->row_stride == 0)
-      display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
+   /* Default the 'row_stride' parameter if required, also check the row stride
+    * and total image size to ensure that they are within the system limits.
+    */
+   {
+      const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
+
+      if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
+      {
+         png_uint_32 check;
+         const png_uint_32 png_row_stride = image->width * channels;
+
+         if (display->row_stride == 0)
+            display->row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+         if (display->row_stride < 0)
+            check = -display->row_stride;
+
+         else
+            check = display->row_stride;
+
+         if (check >= png_row_stride)
+         {
+            /* Now check for overflow of the image buffer calculation; this
+             * limits the whole image size to 32 bits for API compatibility with
+             * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
+             */
+            if (image->height > 0xFFFFFFFF/png_row_stride)
+               png_error(image->opaque->png_ptr, "memory image too large");
+         }
+
+         else
+            png_error(image->opaque->png_ptr, "supplied row stride too small");
+      }
+
+      else
+         png_error(image->opaque->png_ptr, "image row stride too large");
+   }
 
    /* Set the required transforms then write the rows in the correct order. */
    if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
@@ -2138,6 +2175,122 @@ png_image_write_main(png_voidp argument)
    return 1;
 }
 
+
+static void (PNGCBAPI
+image_memory_write)(png_structp png_ptr, png_bytep/*const*/ data,
+   png_size_t size)
+{
+   png_image_write_control *display = png_voidcast(png_image_write_control*,
+      png_ptr->io_ptr/*backdoor: png_get_io_ptr(png_ptr)*/);
+   const png_alloc_size_t ob = display->output_bytes;
+
+   /* Check for overflow; this should never happen: */
+   if (size <= ((png_alloc_size_t)-1) - ob)
+   {
+      /* I don't think libpng ever does this, but just in case: */
+      if (size > 0)
+      {
+         if (display->memory_bytes >= ob+size) /* writing */
+            memcpy(display->memory+ob, data, size);
+
+         /* Always update the size: */
+         display->output_bytes = ob+size;
+      }
+   }
+
+   else
+      png_error(png_ptr, "png_image_write_to_memory: PNG too big");
+}
+
+static void (PNGCBAPI
+image_memory_flush)(png_structp png_ptr)
+{
+   PNG_UNUSED(png_ptr)
+}
+
+static int
+png_image_write_memory(png_voidp argument)
+{
+   png_image_write_control *display = png_voidcast(png_image_write_control*,
+      argument);
+
+   /* The rest of the memory-specific init and write_main in an error protected
+    * environment.  This case needs to use callbacks for the write operations
+    * since libpng has no built in support for writing to memory.
+    */
+   png_set_write_fn(display->image->opaque->png_ptr, display/*io_ptr*/,
+         image_memory_write, image_memory_flush);
+
+   return png_image_write_main(display);
+}
+
+int PNGAPI
+png_image_write_to_memory(png_imagep image, void *memory,
+   png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8bit,
+   const void *buffer, png_int_32 row_stride, const void *colormap)
+{
+   /* Write the image to the given buffer, or count the bytes if it is NULL */
+   if (image != NULL && image->version == PNG_IMAGE_VERSION)
+   {
+      if (memory_bytes != NULL && buffer != NULL)
+      {
+         /* This is to give the caller an easier error detection in the NULL
+          * case and guard against uninitialized variable problems:
+          */
+         if (memory == NULL)
+            *memory_bytes = 0;
+
+         if (png_image_write_init(image) != 0)
+         {
+            png_image_write_control display;
+            int result;
+
+            memset(&display, 0, (sizeof display));
+            display.image = image;
+            display.buffer = buffer;
+            display.row_stride = row_stride;
+            display.colormap = colormap;
+            display.convert_to_8bit = convert_to_8bit;
+            display.memory = png_voidcast(png_bytep, memory);
+            display.memory_bytes = *memory_bytes;
+            display.output_bytes = 0;
+
+            result = png_safe_execute(image, png_image_write_memory, &display);
+            png_image_free(image);
+
+            /* write_memory returns true even if we ran out of buffer. */
+            if (result)
+            {
+               /* On out-of-buffer this function returns '0' but still updates
+                * memory_bytes:
+                */
+               if (memory != NULL && display.output_bytes > *memory_bytes)
+                  result = 0;
+
+               *memory_bytes = display.output_bytes;
+            }
+
+            return result;
+         }
+
+         else
+            return 0;
+      }
+
+      else
+         return png_image_error(image,
+            "png_image_write_to_memory: invalid argument");
+   }
+
+   else if (image != NULL)
+      return png_image_error(image,
+         "png_image_write_to_memory: incorrect PNG_IMAGE_VERSION");
+
+   else
+      return 0;
+}
+
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
 int PNGAPI
 png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
    const void *buffer, png_int_32 row_stride, const void *colormap)
@@ -2145,7 +2298,7 @@ png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
    /* Write the image to the given (FILE*). */
    if (image != NULL && image->version == PNG_IMAGE_VERSION)
    {
-      if (file != NULL)
+      if (file != NULL && buffer != NULL)
       {
          if (png_image_write_init(image) != 0)
          {
@@ -2195,7 +2348,7 @@ png_image_write_to_file(png_imagep image, const char *file_name,
    /* Write the image to the named file. */
    if (image != NULL && image->version == PNG_IMAGE_VERSION)
    {
-      if (file_name != NULL)
+      if (file_name != NULL && buffer != NULL)
       {
          FILE *fp = fopen(file_name, "wb");
 
@@ -2253,6 +2406,6 @@ png_image_write_to_file(png_imagep image, const char *file_name,
    else
       return 0;
 }
-# endif /* STDIO */
+#endif /* SIMPLIFIED_WRITE_STDIO */
 #endif /* SIMPLIFIED_WRITE */
 #endif /* WRITE */
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
index 44e7daf5614..e962c4ff631 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
@@ -30,7 +30,7 @@
  * file and, per its terms, should not be removed:
  *
  * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
index a51f24b94c4..daeb1e79c9e 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
@@ -29,8 +29,8 @@
  * However, the following notice accompanied the original version of this
  * file and, per its terms, should not be removed:
  *
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  *
@@ -51,10 +51,10 @@
 void PNGAPI
 png_save_uint_32(png_bytep buf, png_uint_32 i)
 {
-   buf[0] = (png_byte)(i >> 24);
-   buf[1] = (png_byte)(i >> 16);
-   buf[2] = (png_byte)(i >> 8);
-   buf[3] = (png_byte)(i     );
+   buf[0] = (png_byte)((i >> 24) & 0xffU);
+   buf[1] = (png_byte)((i >> 16) & 0xffU);
+   buf[2] = (png_byte)((i >>  8) & 0xffU);
+   buf[3] = (png_byte)( i        & 0xffU);
 }
 
 /* Place a 16-bit number into a buffer in PNG byte order.
@@ -64,8 +64,8 @@ png_save_uint_32(png_bytep buf, png_uint_32 i)
 void PNGAPI
 png_save_uint_16(png_bytep buf, unsigned int i)
 {
-   buf[0] = (png_byte)(i >> 8);
-   buf[1] = (png_byte)(i     );
+   buf[0] = (png_byte)((i >> 8) & 0xffU);
+   buf[1] = (png_byte)( i       & 0xffU);
 }
 #endif
 
@@ -693,90 +693,6 @@ png_write_compressed_data_out(png_structrp png_ptr, compression_state *comp)
 }
 #endif /* WRITE_COMPRESSED_TEXT */
 
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
-    defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
- * and if invalid, correct the keyword rather than discarding the entire
- * chunk.  The PNG 1.0 specification requires keywords 1-79 characters in
- * length, forbids leading or trailing whitespace, multiple internal spaces,
- * and the non-break space (0x80) from ISO 8859-1.  Returns keyword length.
- *
- * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
- * trailing '\0').  If this routine returns 0 then there was no keyword, or a
- * valid one could not be generated, and the caller must png_error.
- */
-static png_uint_32
-png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
-{
-   png_const_charp orig_key = key;
-   png_uint_32 key_len = 0;
-   int bad_character = 0;
-   int space = 1;
-
-   png_debug(1, "in png_check_keyword");
-
-   if (key == NULL)
-   {
-      *new_key = 0;
-      return 0;
-   }
-
-   while (*key && key_len < 79)
-   {
-      png_byte ch = (png_byte)*key++;
-
-      if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
-         *new_key++ = ch, ++key_len, space = 0;
-
-      else if (space == 0)
-      {
-         /* A space or an invalid character when one wasn't seen immediately
-          * before; output just a space.
-          */
-         *new_key++ = 32, ++key_len, space = 1;
-
-         /* If the character was not a space then it is invalid. */
-         if (ch != 32)
-            bad_character = ch;
-      }
-
-      else if (bad_character == 0)
-         bad_character = ch; /* just skip it, record the first error */
-   }
-
-   if (key_len > 0 && space != 0) /* trailing space */
-   {
-      --key_len, --new_key;
-      if (bad_character == 0)
-         bad_character = 32;
-   }
-
-   /* Terminate the keyword */
-   *new_key = 0;
-
-   if (key_len == 0)
-      return 0;
-
-#ifdef PNG_WARNINGS_SUPPORTED
-   /* Try to only output one warning per keyword: */
-   if (*key != 0) /* keyword too long */
-      png_warning(png_ptr, "keyword truncated");
-
-   else if (bad_character != 0)
-   {
-      PNG_WARNING_PARAMETERS(p)
-
-      png_warning_parameter(p, 1, orig_key);
-      png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
-
-      png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
-   }
-#endif /* WARNINGS */
-
-   return key_len;
-}
-#endif /* WRITE_TEXT || WRITE_pCAL || WRITE_iCCP || WRITE_sPLT */
-
 /* Write the IHDR chunk, and update the png_struct with the necessary
  * information.  Note that the rest of this code depends upon this
  * information being correct.

From 1920a07b8c1f262622379770a29ce5c3a74553de Mon Sep 17 00:00:00 2001
From: Jini George 
Date: Thu, 11 Aug 2016 17:47:47 +0300
Subject: [PATCH 052/115] 8163143: illegal bci error with interpreted frames in
 SA due to mirror being stored in interpreted frames

Added code to represent the frame mirror offset in SA

Reviewed-by: dsamersoff
---
 .../sun/tools/jhsdb/BasicLauncherTest.java    | 47 +++++++++++++------
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
index 604b28241ee..e18b5c76c1d 100644
--- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
+++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
@@ -107,6 +107,38 @@ public class BasicLauncherTest {
         }
     }
 
+    public static void launchJStack() throws IOException {
+
+        if (Platform.isOSX()) {
+            // Coredump stackwalking is not implemented for Darwin
+            System.out.println("This test is not expected to work on OS X. Skipping");
+            return;
+        }
+
+        System.out.println("Starting LingeredApp");
+        try {
+            theApp = LingeredApp.startApp(Arrays.asList("-Xmx256m"));
+
+            System.out.println("Starting jstack against " + theApp.getPid());
+            JDKToolLauncher launcher = createSALauncher();
+
+            launcher.addToolArg("jstack");
+            launcher.addToolArg("--pid=" + Long.toString(theApp.getPid()));
+
+            ProcessBuilder processBuilder = new ProcessBuilder(launcher.getCommand());
+            OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);;
+            output.shouldContain("No deadlocks found");
+            output.shouldNotContain("illegal bci");
+            output.shouldNotContain("AssertionFailure");
+            output.shouldHaveExitValue(0);
+
+        } catch (Exception ex) {
+            throw new RuntimeException("Test ERROR " + ex, ex);
+        } finally {
+            LingeredApp.stopApp(theApp);
+        }
+    }
+
     /**
      *
      * @param vmArgs  - vm and java arguments to launch test app
@@ -151,19 +183,6 @@ public class BasicLauncherTest {
                                                        Arrays.asList(toolArgs));
     }
 
-    public static void launchNotOSX(String expectedMessage,
-                              String unexpectedMessage, String... toolArgs)
-        throws IOException {
-
-        if (Platform.isOSX()) {
-            // Coredump stackwalking is not implemented for Darwin
-            System.out.println("This test is not expected to work on OS X. Skipping");
-            return;
-        }
-
-        launch(expectedMessage, unexpectedMessage, toolArgs);
-    }
-
     public static void testHeapDump() throws IOException {
         File dump = new File("jhsdb.jmap.dump." +
                              System.currentTimeMillis() + ".hprof");
@@ -191,7 +210,7 @@ public class BasicLauncherTest {
         launchCLHSDB();
 
         launch("compiler detected", null, "jmap", "--clstats");
-        launchNotOSX("No deadlocks found", null, "jstack");
+        launchJStack();
         launch("compiler detected", null, "jmap");
         launch("Java System Properties",
                "System Properties info not available", "jinfo");

From d41cfa354ab856d0713bb7ac21079d5a021b50f2 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter 
Date: Thu, 11 Aug 2016 11:35:47 -0700
Subject: [PATCH 053/115] 8145014: "IIOException: Couldn't seek!" when calling
 TIFFImageReader.getNumImages()

In locateImage() break and decrement image count for zero-entry IFDs and on encountering an EOF.

Reviewed-by: prr
---
 .../imageio/plugins/tiff/TIFFImageReader.java |  25 ++-
 .../plugins/tiff/BogusSecondImageTest.java    | 196 ++++++++++++++++++
 2 files changed, 214 insertions(+), 7 deletions(-)
 create mode 100644 jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java

diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
index 317027351fc..bf143b4a7ae 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
@@ -35,6 +35,7 @@ import java.awt.image.ComponentColorModel;
 import java.awt.image.Raster;
 import java.awt.image.RenderedImage;
 import java.awt.image.SampleModel;
+import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
@@ -189,8 +190,8 @@ public class TIFFImageReader extends ImageReader {
 
             // Seek to start of first IFD
             long offset = stream.readUnsignedInt();
-            imageStartPosition.add(Long.valueOf(offset));
             stream.seek(offset);
+            imageStartPosition.add(Long.valueOf(offset));
         } catch (IOException e) {
             throw new IIOException("I/O error reading header!", e);
         }
@@ -201,10 +202,10 @@ public class TIFFImageReader extends ImageReader {
     private int locateImage(int imageIndex) throws IIOException {
         readHeader();
 
-        try {
-            // Find closest known index
-            int index = Math.min(imageIndex, imageStartPosition.size() - 1);
+        // Find closest known index
+        int index = Math.min(imageIndex, imageStartPosition.size() - 1);
 
+        try {
             // Seek to that position
             Long l = imageStartPosition.get(index);
             stream.seek(l.longValue());
@@ -212,6 +213,11 @@ public class TIFFImageReader extends ImageReader {
             // Skip IFDs until at desired index or last image found
             while (index < imageIndex) {
                 int count = stream.readUnsignedShort();
+                // If zero-entry IFD, decrement the index and exit the loop
+                if (count == 0) {
+                    imageIndex = index > 0 ? index - 1 : 0;
+                    break;
+                }
                 stream.skipBytes(12 * count);
 
                 long offset = stream.readUnsignedInt();
@@ -219,12 +225,17 @@ public class TIFFImageReader extends ImageReader {
                     return index;
                 }
 
-                imageStartPosition.add(Long.valueOf(offset));
                 stream.seek(offset);
+                imageStartPosition.add(Long.valueOf(offset));
                 ++index;
             }
-        } catch (IOException e) {
-            throw new IIOException("Couldn't seek!", e);
+        } catch (EOFException eofe) {
+            forwardWarningMessage("Ignored " + eofe);
+
+            // Ran off the end of stream: decrement index
+            imageIndex = index > 0 ? index - 1 : 0;
+        } catch (IOException ioe) {
+            throw new IIOException("Couldn't seek!", ioe);
         }
 
         if (currIndex != imageIndex) {
diff --git a/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java b/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java
new file mode 100644
index 00000000000..5ebadab8631
--- /dev/null
+++ b/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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 8145014
+ * @summary Verify reader correctly fails for zero-entry IFDs and EOFs
+ *          encountered in locateImage().
+ */
+
+import java.awt.Image;
+import java.awt.image.*;
+import java.io.*;
+import java.util.Iterator;
+import javax.imageio.*;
+import javax.imageio.stream.*;
+
+public class BogusSecondImageTest {
+    public static void main(String[] args) throws Throwable {
+        int failures = 0;
+
+        try {
+            testZeroEntryIFD();
+        } catch (Exception e) {
+            System.out.printf("Failed testZeroEntryIFD: %s%n", e);
+            failures++;
+        }
+
+        try {
+            testOutOfStreamIFD();
+        } catch (Exception e) {
+            System.out.printf("Failed testOutOfStreamIFD: %s%n", e);
+            failures++;
+        }
+
+        if (failures == 0) {
+            System.out.println("Test succeeded");
+        } else {
+            throw new RuntimeException
+                ("Test failed with " + failures + " errors");
+        }
+    }
+
+    private static void testZeroEntryIFD() throws Exception {
+        // Create an image.
+        File f = createImageFile();
+
+        ImageOutputStream s = new FileImageOutputStream(f);
+        long length = s.length();
+
+        // Skip the endianness and magic number
+        s.skipBytes(4);
+
+        // Read and seek to offset of 0th IFD
+        long ifd0 = s.readUnsignedInt();
+        s.seek(ifd0);
+
+        // Read number of 0th IFD entries and skip over them
+        int entries0 = s.readUnsignedShort();
+        s.skipBytes(12*entries0);
+
+        // Write the offset of the 1st IFD as the current file length
+        s.write((int)length);
+
+        // Seek to the 1st IFD and write a zero entry count to it
+        s.seek(length);
+        s.writeShort(0);
+        s.close();
+
+        try {
+            Load(f);
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            f.delete();
+        }
+    }
+
+    private static void testOutOfStreamIFD() throws Exception {
+        // Create an image.
+        File f = createImageFile();
+        ImageOutputStream s = new FileImageOutputStream(f);
+        long length = s.length();
+
+        // Skip the endianness and magic number
+        s.skipBytes(4);
+
+        // Read and seek to offset of 0th IFD
+        long ifd0 = s.readUnsignedInt();
+        s.seek(ifd0);
+
+        // Read number of 0th IFD entries and skip over them
+        int entries0 = s.readUnsignedShort();
+        s.skipBytes(12*entries0);
+
+        // Write the offset of the 1st IFD as the current file length + 7
+        s.write((int)length + 7);
+        s.close();
+
+        try {
+            Load(f);
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            f.delete();
+        }
+    }
+
+    private static File createImageFile() throws Exception {
+        BufferedImage im =
+        new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
+        File f = File.createTempFile("BogusSecondImage", "tif", new File("."));
+        f.deleteOnExit();
+        if (!ImageIO.write(im, "TIFF", f)) {
+            throw new RuntimeException("Failed to write " + f);
+        }
+        return f;
+    }
+
+    private final static boolean printTrace = false;
+
+    public static void Load(File file) {
+        if (!file.exists()) {
+            throw new IllegalArgumentException(file + " does not exist");
+        } else if (!file.isFile()) {
+            throw new IllegalArgumentException(file + " is not a regular file");
+        } else if (!file.canRead()) {
+            throw new IllegalArgumentException(file + " cannot be read");
+        }
+
+        ImageInputStream input = null;
+        try {
+            input = ImageIO.createImageInputStream(file);
+        } catch (Throwable e) {
+            System.err.println("NOK: createImageInputStream()\t" + e.getMessage());
+            if (printTrace) { e.printStackTrace(); }
+            return;
+        }
+
+        Iterator readers = ImageIO.getImageReadersByFormatName("TIFF");
+        if (!readers.hasNext()) { throw new RuntimeException("No readers available for TIFF"); }
+        ImageReader reader = readers.next();
+        reader.setInput(input);
+
+        Image images[] = null;
+        int numImages = 0;
+
+        int failures = 0;
+        try {
+            numImages = reader.getNumImages(true);
+            images = new Image[numImages];
+        } catch (Throwable e) {
+            failures++;
+            System.err.println("NOK: getNumImages()\t" + e.getMessage());
+            if (printTrace) { e.printStackTrace(); }
+        }
+        System.out.printf("numImages %d%n", numImages);
+
+        for (int i = 0; i < numImages; i++) {
+            System.out.printf("reading image %d%n", i);
+            try {
+                images[i] = reader.read(i);
+            } catch (Throwable e) {
+                failures++;
+                System.err.println("NOK: read()\t" + e.getMessage());
+                if (printTrace) { e.printStackTrace(); }
+            }
+        }
+
+        if (failures == 0) {
+            System.err.println("OK");
+        } else {
+            throw new RuntimeException("NOK");
+        }
+    }
+}

From d05e00ca7656298da89c8c208aa890fe95ee7e23 Mon Sep 17 00:00:00 2001
From: "Daniel D. Daugherty" 
Date: Thu, 11 Aug 2016 12:27:20 -0700
Subject: [PATCH 054/115] 8163879: quarantine
 serviceability/sa/sadebugd/SADebugDTest.java since it hangs intermittently

Reviewed-by: hseigel
---
 hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
index 7264ee2cf24..a9cf6e53119 100644
--- a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
+++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
@@ -28,6 +28,7 @@
  * @modules java.base/jdk.internal.misc
  * @library /test/lib/share/classes
  *
+ * @ignore 8163805
  * @run main/othervm SADebugDTest
  */
 import java.io.File;

From 780aad0314d71900d2d1e7329b9e4e411de8b6a3 Mon Sep 17 00:00:00 2001
From: Pete Brunet 
Date: Thu, 11 Aug 2016 21:48:53 -0500
Subject: [PATCH 055/115] 8161483: Implement AccessibleAction interface in
 JList.AccessibleJList.AccessibleJListChild

Move AccessibleAction implementation from subclass to AccessibleJListChild

Reviewed-by: alexsch, prr, darcy
---
 .../share/classes/javax/swing/JList.java      |  48 +++++---
 .../javax/swing/JList/8161483/Bug8161483.java | 104 ++++++++++++++++++
 2 files changed, 138 insertions(+), 14 deletions(-)
 create mode 100644 jdk/test/javax/swing/JList/8161483/Bug8161483.java

diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JList.java b/jdk/src/java.desktop/share/classes/javax/swing/JList.java
index d745527872b..5e9866356a0 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/JList.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JList.java
@@ -3058,7 +3058,7 @@ public class JList extends JComponent implements Scrollable, Accessible
         public Accessible getAccessibleAt(Point p) {
             int i = locationToIndex(p);
             if (i >= 0) {
-                return new ActionableAccessibleJListChild(JList.this, i);
+                return new AccessibleJListChild(JList.this, i);
             } else {
                 return null;
             }
@@ -3085,7 +3085,7 @@ public class JList extends JComponent implements Scrollable, Accessible
             if (i >= getModel().getSize()) {
                 return null;
             } else {
-                return new ActionableAccessibleJListChild(JList.this, i);
+                return new AccessibleJListChild(JList.this, i);
             }
         }
 
@@ -3188,7 +3188,7 @@ public class JList extends JComponent implements Scrollable, Accessible
            * for list children.
            */
         protected class AccessibleJListChild extends AccessibleContext
-                implements Accessible, AccessibleComponent {
+                implements Accessible, AccessibleComponent, AccessibleAction {
             private JList     parent = null;
             int indexInParent;
             private Component component = null;
@@ -3743,16 +3743,17 @@ public class JList extends JComponent implements Scrollable, Accessible
                 }
             }
 
-        } // inner class AccessibleJListChild
-
-        private class ActionableAccessibleJListChild
-            extends AccessibleJListChild
-            implements AccessibleAction {
-
-            ActionableAccessibleJListChild(JList parent, int indexInParent) {
-                super(parent, indexInParent);
-            }
-
+            /**
+             * {@inheritDoc}
+             * @implSpec Returns the AccessibleAction for this AccessibleJListChild
+             * as follows:  First getListCellRendererComponent of the ListCellRenderer
+             * for the component at the "index in parent" of this child is called.
+             * Then its AccessibleContext is fetched and that AccessibleContext's
+             * AccessibleAction is returned.  Note that if an AccessibleAction
+             * is not found using this process then this object with its implementation
+             * of the AccessibleAction interface is returned.
+             * @since 9
+             */
             @Override
             public AccessibleAction getAccessibleAction() {
                 AccessibleContext ac = getCurrentAccessibleContext();
@@ -3768,6 +3769,13 @@ public class JList extends JComponent implements Scrollable, Accessible
                 }
             }
 
+            /**
+             * {@inheritDoc}
+             * @implSpec If i == 0 selects this AccessibleJListChild by calling
+             * JList.this.setSelectedIndex(indexInParent) and then returns true;
+             * otherwise returns false.
+             * @since 9
+             */
             @Override
             public boolean doAccessibleAction(int i) {
                 if (i == 0) {
@@ -3778,6 +3786,13 @@ public class JList extends JComponent implements Scrollable, Accessible
                 }
             }
 
+            /**
+             * {@inheritDoc}
+             * @implSpec If i == 0 returns the action description fetched from
+             * UIManager.getString("AbstractButton.clickText");
+             * otherwise returns null.
+             * @since 9
+             */
             @Override
             public String getAccessibleActionDescription(int i) {
                 if (i == 0) {
@@ -3787,12 +3802,17 @@ public class JList extends JComponent implements Scrollable, Accessible
                 }
             }
 
+            /**
+             * {@inheritDoc}
+             * @implSpec Returns 1, i.e. there is only one action.
+             * @since 9
+             */
             @Override
             public int getAccessibleActionCount() {
                 return 1;
             }
 
-        } // inner class ActionableAccessibleJListChild
+        } // inner class AccessibleJListChild
 
     } // inner class AccessibleJList
 }
diff --git a/jdk/test/javax/swing/JList/8161483/Bug8161483.java b/jdk/test/javax/swing/JList/8161483/Bug8161483.java
new file mode 100644
index 00000000000..275b871f136
--- /dev/null
+++ b/jdk/test/javax/swing/JList/8161483/Bug8161483.java
@@ -0,0 +1,104 @@
+/*
+ * 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 8161483
+ * @summary Implement AccessibleAction in JList.AccessibleJList.AccessibleJListChild
+ * @run main Bug8161483
+ */
+
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleSelection;
+import javax.swing.DefaultListModel;
+import javax.swing.JFrame;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+
+public class Bug8161483 extends JFrame {
+
+    private static JFrame frame;
+    private static volatile Exception exception = null;
+    private JList countryList;
+
+    public static void main(String args[]) throws Exception {
+        try {
+            SwingUtilities.invokeAndWait(() -> {
+                DefaultListModel listModel = new DefaultListModel<>();
+                listModel.addElement("one");
+                listModel.addElement("two");
+                listModel.addElement("three");
+                JList list = new JList<>(listModel);
+                frame = new JFrame();
+                frame.add(list);
+                frame.pack();
+                try {
+                    AccessibleContext acList = list.getAccessibleContext();
+                    Accessible accChild = acList.getAccessibleChild(1);
+                    AccessibleContext acChild = accChild.getAccessibleContext();
+                    AccessibleAction aa = acChild.getAccessibleAction();
+                    int c = aa.getAccessibleActionCount();
+                    if (c != 1) {
+                        throw new RuntimeException("getAccessibleActionCount is not 1");
+                    }
+                    String s = aa.getAccessibleActionDescription(0);
+                    if (!s.equals("click")) {
+                        throw new RuntimeException("getAccessibleActionDescription is not click");
+                    }
+                    boolean b = aa.doAccessibleAction(0);
+                    if (!b) {
+                        throw new RuntimeException("doAccessibleAction did not return true");
+                    }
+                    AccessibleSelection as = acList.getAccessibleSelection();
+                    int asc = as.getAccessibleSelectionCount();
+                    if (asc != 1) {
+                        throw new RuntimeException("getAccessibleSelectionCount is not 1");
+                    }
+                    boolean isSelected = as.isAccessibleChildSelected(0);
+                    if (isSelected) {
+                        throw new RuntimeException("isAccessibleChildSelected(0) did not return false");
+                    }
+                    isSelected = as.isAccessibleChildSelected(1);
+                    if (!isSelected) {
+                        throw new RuntimeException("isAccessibleChildSelected(1) did not return true");
+                    }
+                } catch (Exception e) {
+                    exception = e;
+                }
+            });
+            if (exception != null) {
+                System.out.println("Test failed: " + exception.getMessage());
+                throw exception;
+            } else {
+                System.out.println("Test passed.");
+            }
+        } finally {
+            SwingUtilities.invokeAndWait(() -> {
+                frame.dispose();
+            });
+        }
+    }
+
+}

From 2b8954d7e41295f15c57f872026254cf595c2447 Mon Sep 17 00:00:00 2001
From: Mikhail Cherkasov 
Date: Fri, 12 Aug 2016 18:43:13 +0300
Subject: [PATCH 056/115] 8160696: IllegalArgumentException: adding a component
 to a container on a different GraphicsDevice

Reviewed-by: serb
---
 .../share/classes/java/awt/Container.java     | 15 ++--
 .../MoveToOtherScreenTest.java                | 88 +++++++++++++++++++
 2 files changed, 96 insertions(+), 7 deletions(-)
 create mode 100644 jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java

diff --git a/jdk/src/java.desktop/share/classes/java/awt/Container.java b/jdk/src/java.desktop/share/classes/java/awt/Container.java
index 04e3f1e89bd..13d5e23ed1c 100644
--- a/jdk/src/java.desktop/share/classes/java/awt/Container.java
+++ b/jdk/src/java.desktop/share/classes/java/awt/Container.java
@@ -1109,17 +1109,18 @@ public class Container extends Component {
             }
             checkAddToSelf(comp);
             checkNotAWindow(comp);
+            /* Reparent the component and tidy up the tree's state. */
+            if (comp.parent != null) {
+                comp.parent.remove(comp);
+                if (index > component.size()) {
+                    throw new IllegalArgumentException("illegal component position");
+                }
+            }
             if (thisGC != null) {
                 comp.checkGD(thisGC.getDevice().getIDstring());
             }
 
-            /* Reparent the component and tidy up the tree's state. */
-            if (comp.parent != null) {
-                comp.parent.remove(comp);
-                    if (index > component.size()) {
-                        throw new IllegalArgumentException("illegal component position");
-                    }
-            }
+
 
             //index == -1 means add to the end.
             if (index == -1) {
diff --git a/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java b/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java
new file mode 100644
index 00000000000..fcc4fcc72b5
--- /dev/null
+++ b/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.lang.reflect.InvocationTargetException;
+
+
+
+/* @test
+   @bug 8160696
+   @summary IllegalArgumentException: adding a component to a container on a different GraphicsDevice
+   @author Mikhail Cherkasov
+   @run main MoveToOtherScreenTest
+   @key headful
+*/
+public class MoveToOtherScreenTest {
+
+    private static volatile boolean twoDisplays = true;
+    private static final Canvas canvas = new Canvas();
+    private static final Frame[] frms = new JFrame[2];
+
+    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                GraphicsEnvironment ge = GraphicsEnvironment.
+                        getLocalGraphicsEnvironment();
+                GraphicsDevice[] gds = ge.getScreenDevices();
+                if (gds.length < 2) {
+                    System.out.println("Test requires at least 2 displays");
+                    twoDisplays = false;
+                    return;
+                }
+                for (int i = 0; i < 2; i++) {
+                    GraphicsConfiguration conf = gds[i].getConfigurations()[0];
+                    JFrame frm = new JFrame("Frame " + i);
+                    frm.setLocation(conf.getBounds().x, 0); // On first screen
+                    frm.setSize(new Dimension(400, 400));
+                    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                    frm.setVisible(true);
+                    frms[i] = frm;
+                }
+                canvas.setBackground(Color.red);
+                frms[0].add(canvas);
+            }
+        });
+        if(!twoDisplays){
+           return;
+        }
+        Thread.sleep(200);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frms[1].add(canvas);
+            }
+        });
+        for (Frame frm : frms) {
+            frm.dispose();
+        }
+    }
+}

From ab8079d89a0f2eafc9caebd8615593258b178ffb Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov 
Date: Fri, 12 Aug 2016 20:36:41 +0300
Subject: [PATCH 057/115] 8159696: java.beans.MethodRef#get throws
 NullPointerException

Reviewed-by: alexsch
---
 .../share/classes/java/beans/MethodRef.java   |  7 +-
 .../8159696/UnloadClassBeanInfo.java          | 78 +++++++++++++++++++
 .../beans/Introspector/8159696/stub/Stub.java | 29 +++++++
 3 files changed, 110 insertions(+), 4 deletions(-)
 create mode 100644 jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
 create mode 100644 jdk/test/java/beans/Introspector/8159696/stub/Stub.java

diff --git a/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java b/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
index 59b2690b4fa..6be617f2951 100644
--- a/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
+++ b/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 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
@@ -64,10 +64,9 @@ final class MethodRef {
                 this.signature = null;
                 this.methodRef = null;
                 this.typeRef = null;
+                return null;
             }
-            else {
-                this.methodRef = new SoftReference<>(method);
-            }
+            this.methodRef = new SoftReference<>(method);
         }
         return isPackageAccessible(method.getDeclaringClass()) ? method : null;
     }
diff --git a/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java b/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
new file mode 100644
index 00000000000..8c77b3565a8
--- /dev/null
+++ b/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
@@ -0,0 +1,78 @@
+/*
+ * 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.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.MethodDescriptor;
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8159696
+ * @library /javax/swing/regtesthelpers
+ * @compile ./stub/Stub.java
+ * @run main/othervm -mx32M UnloadClassBeanInfo
+ */
+public class UnloadClassBeanInfo {
+
+    private static URLClassLoader loader;
+
+    public static void main(final String[] args) throws Exception {
+        Class cl = getStub();
+        System.out.println("cl.getClassLoader() = " + cl.getClassLoader());
+        final BeanInfo beanInfo = Introspector.getBeanInfo(cl, Object.class);
+        MethodDescriptor[] mds = beanInfo.getMethodDescriptors();
+        System.out.println("mds = " + Arrays.toString(mds));
+        loader.close();
+        loader=null;
+        cl=null;
+        Util.generateOOME();
+        mds = beanInfo.getMethodDescriptors();
+        System.out.println("mds = " + Arrays.toString(mds));
+    }
+
+    /**
+     * The Stub class is compiled by jtreg, but we want to move it so it is not
+     * on the application classpath. We want to load it through a separate
+     * classloader.
+     */
+    static Class getStub() throws Exception {
+        final String testclasses = System.getProperty("test.classes");
+        final File subdir = new File(testclasses, "stub");
+        subdir.mkdir();
+
+        final Path src = Paths.get(testclasses, "Stub.class");
+        final Path dest = subdir.toPath().resolve("Stub.class");
+        Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING);
+
+        loader = new URLClassLoader(new URL[]{subdir.toURL()});
+        return Class.forName("Stub", true, loader);
+    }
+}
diff --git a/jdk/test/java/beans/Introspector/8159696/stub/Stub.java b/jdk/test/java/beans/Introspector/8159696/stub/Stub.java
new file mode 100644
index 00000000000..2c093ec6d4d
--- /dev/null
+++ b/jdk/test/java/beans/Introspector/8159696/stub/Stub.java
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+public final class Stub {
+
+    public void test() {
+
+    }
+}

From 61860ae01d703e87d46eaeeec78035ab54a6ea46 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter 
Date: Fri, 12 Aug 2016 14:35:56 -0700
Subject: [PATCH 058/115] 8152966: ClassCastException when adding IFD to the
 TIFFDirectory before the image write

Move the private method getDirectoryAsIFD(TIFFDirectory) from the API class TIFFDirectory to a public method in the internal class TIFFIFD and replace all casts of TIFFDirectory to TIFFIFD with its invocation

Reviewed-by: prr
---
 .../com/sun/imageio/plugins/tiff/TIFFIFD.java | 41 +++++++-
 .../plugins/tiff/TIFFImageMetadata.java       |  2 +-
 .../imageio/plugins/tiff/TIFFImageWriter.java |  2 +-
 .../imageio/plugins/tiff/TIFFDirectory.java   | 40 +-------
 .../javax/imageio/plugins/tiff/IFDTest.java   | 99 +++++++++++++++++++
 5 files changed, 142 insertions(+), 42 deletions(-)
 create mode 100644 jdk/test/javax/imageio/plugins/tiff/IFDTest.java

diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
index 46d1419ee4c..0a305c09726 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
@@ -49,6 +49,45 @@ public class TIFFIFD extends TIFFDirectory {
     private long stripOrTileOffsetsPosition = -1;
     private long lastPosition = -1;
 
+
+    /**
+     * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
+     */
+    public static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
+        if(dir instanceof TIFFIFD) {
+            return (TIFFIFD)dir;
+        }
+
+        TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
+                                  dir.getParentTag());
+        TIFFField[] fields = dir.getTIFFFields();
+        int numFields = fields.length;
+        for(int i = 0; i < numFields; i++) {
+            TIFFField f = fields[i];
+            TIFFTag tag = f.getTag();
+            if(tag.isIFDPointer()) {
+                TIFFDirectory subDir = null;
+                if (f.hasDirectory()) {
+                    subDir = f.getDirectory();
+                } else if (f.getData() instanceof TIFFDirectory) {
+                    subDir = (TIFFDirectory)f.getData();
+                }
+                if (subDir != null) {
+                    TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
+                    f = new TIFFField(tag, f.getType(), (long)f.getCount(),
+                                      subIFD);
+                } else {
+                    f = null;
+                }
+            }
+            if (f != null) {
+                ifd.addTIFFField(f);
+            }
+        }
+
+        return ifd;
+    }
+
     public static TIFFTag getTag(int tagNumber, List tagSets) {
         Iterator iter = tagSets.iterator();
         while (iter.hasNext()) {
@@ -704,7 +743,7 @@ public class TIFFIFD extends TIFFDirectory {
                 pos = nextSpace;
 
                 if (tag.isIFDPointer() && f.hasDirectory()) {
-                    TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+                    TIFFIFD subIFD = getDirectoryAsIFD(f.getDirectory());
                     subIFD.writeToStream(stream);
                     nextSpace = subIFD.lastPosition;
                 } else {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
index 6cfcc9a3b34..a1455315331 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
@@ -132,7 +132,7 @@ public class TIFFImageMetadata extends IIOMetadata {
             if (tag == null) {
                 node = f.getAsNativeNode();
             } else if (tag.isIFDPointer() && f.hasDirectory()) {
-                TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+                TIFFIFD subIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
 
                 // Recurse
                 node = getIFDAsTree(subIFD, tag.getName(), tag.getNumber());
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
index d2f544ad923..9924c3d2210 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
@@ -1478,7 +1478,7 @@ public class TIFFImageWriter extends ImageWriter {
                 (ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER);
             if(f != null && f.hasDirectory()) {
                 // Retrieve the Exif IFD.
-                exifIFD = (TIFFIFD)f.getDirectory();
+                exifIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
             } else if(isPrimaryIFD) {
                 // Create the Exif IFD.
                 List exifTagSets = new ArrayList(1);
diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
index f3e5577716a..7678762203f 100644
--- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
+++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
@@ -203,44 +203,6 @@ public class TIFFDirectory implements Cloneable {
         return tim.getRootIFD();
     }
 
-    /**
-     * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
-     */
-    private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
-        if(dir instanceof TIFFIFD) {
-            return (TIFFIFD)dir;
-        }
-
-        TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
-                                  dir.getParentTag());
-        TIFFField[] fields = dir.getTIFFFields();
-        int numFields = fields.length;
-        for(int i = 0; i < numFields; i++) {
-            TIFFField f = fields[i];
-            TIFFTag tag = f.getTag();
-            if(tag.isIFDPointer()) {
-                TIFFDirectory subDir = null;
-                if (f.hasDirectory()) {
-                    subDir = f.getDirectory();
-                } else if (f.getData() instanceof TIFFDirectory) {
-                    subDir = (TIFFDirectory)f.getData();
-                }
-                if (subDir != null) {
-                    TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
-                    f = new TIFFField(tag, f.getType(), (long)f.getCount(),
-                                      subIFD);
-                } else {
-                    f = null;
-                }
-            }
-            if (f != null) {
-                ifd.addTIFFField(f);
-            }
-        }
-
-        return ifd;
-    }
-
     /**
      * Constructs a {@code TIFFDirectory} which is aware of a given
      * group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
@@ -459,7 +421,7 @@ public class TIFFDirectory implements Cloneable {
      * {@code TIFFDirectory}.
      */
     public IIOMetadata getAsMetadata() {
-        return new TIFFImageMetadata(getDirectoryAsIFD(this));
+        return new TIFFImageMetadata(TIFFIFD.getDirectoryAsIFD(this));
     }
 
     /**
diff --git a/jdk/test/javax/imageio/plugins/tiff/IFDTest.java b/jdk/test/javax/imageio/plugins/tiff/IFDTest.java
new file mode 100644
index 00000000000..6822477749c
--- /dev/null
+++ b/jdk/test/javax/imageio/plugins/tiff/IFDTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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     8152966
+ * @summary Verify that casting of TIFFDirectory to TIFFIFD has been fixed.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import javax.imageio.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.*;
+
+
+import javax.imageio.plugins.tiff.*;
+
+
+public class IFDTest {
+
+    private ImageWriter getTIFFWriter() {
+
+        java.util.Iterator writers =
+            ImageIO.getImageWritersByFormatName("TIFF");
+        if (!writers.hasNext()) {
+            throw new RuntimeException("No readers available for TIFF format");
+        }
+        return writers.next();
+    }
+
+    private void writeImage() throws Exception {
+
+        File file = File.createTempFile("IFDTest", "tif", new File("."));
+        file.deleteOnExit();
+
+        OutputStream s = new BufferedOutputStream(
+            new FileOutputStream("test.tiff"));
+        try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) {
+
+            ImageWriter writer = getTIFFWriter();
+            writer.setOutput(ios);
+
+            BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB);
+            Graphics g = img.getGraphics();
+            g.setColor(Color.GRAY);
+            g.fillRect(0, 0, 20, 20);
+            g.dispose();
+
+            IIOMetadata metadata = writer.getDefaultImageMetadata(
+                new ImageTypeSpecifier(img), writer.getDefaultWriteParam());
+
+            TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata);
+
+            int type = TIFFTag.TIFF_IFD_POINTER;
+            int nTag = ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER;
+            TIFFTag tag = new TIFFTag("Exif IFD", nTag, 1 << type);
+            TIFFTagSet sets[] = {ExifTIFFTagSet.getInstance()};
+
+            TIFFField f = new TIFFField(tag, type, 42L, new TIFFDirectory(sets, tag));
+            dir.addTIFFField(f);
+
+            writer.write(new IIOImage(img, null, dir.getAsMetadata()));
+
+            ios.flush();
+            writer.dispose();
+        } finally {
+            s.close();
+            file.delete();
+        }
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        (new IFDTest()).writeImage();
+    }
+}

From a39d9629ddd66408aedabe1b6d20f75f220a5315 Mon Sep 17 00:00:00 2001
From: Erik Joelsson 
Date: Mon, 15 Aug 2016 16:14:59 +0200
Subject: [PATCH 059/115] 8069540: Remove universal binaries support from
 hotspot build

Reviewed-by: tbell, dholmes, dcubed
---
 common/autoconf/spec.gmk.in | 2 --
 1 file changed, 2 deletions(-)

diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index e4d41e81b43..c591a79d327 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -251,8 +251,6 @@ SUPPORT_HEADLESS:=@SUPPORT_HEADLESS@
 # Legacy support
 USE_NEW_HOTSPOT_BUILD:=@USE_NEW_HOTSPOT_BUILD@
 
-MACOSX_UNIVERSAL=@MACOSX_UNIVERSAL@
-
 # JDK_OUTPUTDIR specifies where a working jvm is built.
 # You can run $(JDK_OUTPUTDIR)/bin/java
 # Though the layout of the contents of $(JDK_OUTPUTDIR) is not

From d57ddc21e8485412652403d3b8529081f4a41671 Mon Sep 17 00:00:00 2001
From: Erik Joelsson 
Date: Mon, 15 Aug 2016 16:15:16 +0200
Subject: [PATCH 060/115] 8069540: Remove universal binaries support from
 hotspot build

Reviewed-by: tbell, dholmes, dcubed
---
 hotspot/make/Dist.gmk | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/hotspot/make/Dist.gmk b/hotspot/make/Dist.gmk
index bfe3daf2062..710de55960c 100644
--- a/hotspot/make/Dist.gmk
+++ b/hotspot/make/Dist.gmk
@@ -45,15 +45,6 @@ else
   LIB_SUBDIR := lib$(OPENJDK_TARGET_CPU_LIBDIR)
 endif
 
-################################################################################
-# Functions to setup copying of files for variants
-
-# Support macro for SetupDistLibFile
-define macosx_universalize
-	$(MKDIR) -p $(@D)
-	$(LIPO) -create -output $@ $<
-endef
-
 ################################################################################
 # Setup make rules to copy a native library and associated data.
 #
@@ -74,16 +65,9 @@ define SetupDistLibFileBody
   $1_LIB_NAME := $(LIBRARY_PREFIX)$$($1_NAME)
   $1_TARGET_DIR := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$$($1_VARIANT_TARGET_DIR)
 
-  ifeq ($(OPENJDK_TARGET_OS), macosx)
-    # We must use the 'universalize' macro to run lipo on shared libraries, at
-    # least until JDK-8069540 is fixed.
-    $1_MACRO := macosx_universalize
-  endif
-
   # Copy the the native library.
   $$(eval $$(call SetupCopyFiles, $1_COPY_LIB, \
       DEST := $$($1_TARGET_DIR), \
-      MACRO := $$($1_MACRO), \
       FILES := $$(wildcard \
           $$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX)), \
   ))

From 50c19d91941e8bebe3e8f162a3a4cf1beeb4a8ab Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov 
Date: Mon, 15 Aug 2016 20:08:55 +0300
Subject: [PATCH 061/115] 8163949: Cleanup of classes which are related to
 JavaSound

Reviewed-by: prr
---
 .../com/sun/media/sound/AbstractDataLine.java |  48 ++---
 .../com/sun/media/sound/AbstractLine.java     |  25 +--
 .../sun/media/sound/AbstractMidiDevice.java   |  92 +++------
 .../sound/AbstractMidiDeviceProvider.java     |   8 -
 .../com/sun/media/sound/AbstractMixer.java    |  56 ++---
 .../com/sun/media/sound/AiffFileFormat.java   |   1 -
 .../com/sun/media/sound/AiffFileReader.java   |   1 -
 .../com/sun/media/sound/AlawCodec.java        |  30 +--
 .../media/sound/AudioFileSoundbankReader.java |   3 +
 .../sun/media/sound/AudioFloatConverter.java  | 138 ++++++++-----
 .../sound/AudioFloatFormatConverter.java      |  48 ++++-
 .../media/sound/AudioFloatInputStream.java    |  19 ++
 .../com/sun/media/sound/AudioSynthesizer.java |  14 +-
 .../sound/AudioSynthesizerPropertyInfo.java   |   1 +
 .../com/sun/media/sound/AutoClosingClip.java  |   2 +-
 .../sun/media/sound/AutoConnectSequencer.java |   3 +-
 .../classes/com/sun/media/sound/DLSInfo.java  |   1 +
 .../com/sun/media/sound/DLSInstrument.java    |  17 +-
 .../com/sun/media/sound/DLSModulator.java     |   1 +
 .../com/sun/media/sound/DLSRegion.java        |   3 +-
 .../com/sun/media/sound/DLSSample.java        |   5 +
 .../com/sun/media/sound/DLSSampleLoop.java    |   1 +
 .../com/sun/media/sound/DLSSampleOptions.java |   3 +-
 .../com/sun/media/sound/DLSSoundbank.java     |  34 +--
 .../sun/media/sound/DLSSoundbankReader.java   |   4 +
 .../com/sun/media/sound/DataPusher.java       |   7 +-
 .../sun/media/sound/DirectAudioDevice.java    | 115 +++++------
 .../sound/DirectAudioDeviceProvider.java      |  18 +-
 .../sun/media/sound/EmergencySoundbank.java   |   1 +
 .../com/sun/media/sound/EventDispatcher.java  |  44 ++--
 .../classes/com/sun/media/sound/FFT.java      |   4 +-
 .../com/sun/media/sound/FastShortMessage.java |  19 +-
 .../com/sun/media/sound/FastSysexMessage.java |   6 +-
 .../sun/media/sound/InvalidDataException.java |   1 +
 .../media/sound/InvalidFormatException.java   |   1 +
 .../sun/media/sound/JARSoundbankReader.java   |   5 +-
 .../com/sun/media/sound/JDK13Services.java    |   3 -
 .../sun/media/sound/JSSecurityManager.java    |  12 +-
 .../sun/media/sound/JavaSoundAudioClip.java   |  54 +++--
 .../sound/MidiDeviceReceiverEnvelope.java     |  10 +-
 .../sound/MidiDeviceTransmitterEnvelope.java  |  12 +-
 .../com/sun/media/sound/MidiInDevice.java     |  32 +--
 .../sun/media/sound/MidiInDeviceProvider.java |  18 +-
 .../com/sun/media/sound/MidiOutDevice.java    |  33 +--
 .../media/sound/MidiOutDeviceProvider.java    |  20 +-
 .../com/sun/media/sound/MidiUtils.java        |   9 -
 .../sound/ModelAbstractChannelMixer.java      |  29 +++
 .../media/sound/ModelAbstractOscillator.java  |  19 +-
 .../com/sun/media/sound/ModelByteBuffer.java  |  10 +
 .../media/sound/ModelByteBufferWavetable.java |  20 +-
 .../sun/media/sound/ModelChannelMixer.java    |   5 +-
 .../sun/media/sound/ModelConnectionBlock.java |   1 +
 .../com/sun/media/sound/ModelDestination.java |   1 +
 .../sun/media/sound/ModelDirectedPlayer.java  |   3 +-
 .../com/sun/media/sound/ModelDirector.java    |   7 +-
 .../com/sun/media/sound/ModelIdentifier.java  |   4 +
 .../com/sun/media/sound/ModelInstrument.java  |   1 +
 .../sound/ModelInstrumentComparator.java      |   3 +
 .../media/sound/ModelMappedInstrument.java    |   9 +-
 .../com/sun/media/sound/ModelOscillator.java  |   7 +-
 .../media/sound/ModelOscillatorStream.java    |  14 +-
 .../com/sun/media/sound/ModelPatch.java       |   1 +
 .../com/sun/media/sound/ModelPerformer.java   |   7 +-
 .../com/sun/media/sound/ModelSource.java      |   1 +
 .../media/sound/ModelStandardDirector.java    |   4 +
 .../sound/ModelStandardIndexedDirector.java   |   4 +
 .../media/sound/ModelStandardTransform.java   |   2 +
 .../com/sun/media/sound/ModelTransform.java   |   3 +-
 .../com/sun/media/sound/ModelWavetable.java   |  21 +-
 .../com/sun/media/sound/PCMtoPCMCodec.java    |  38 +---
 .../classes/com/sun/media/sound/Platform.java |  17 --
 .../com/sun/media/sound/PortMixer.java        |  57 +++--
 .../sun/media/sound/PortMixerProvider.java    |  17 +-
 .../media/sound/RIFFInvalidDataException.java |   1 +
 .../sound/RIFFInvalidFormatException.java     |   1 +
 .../com/sun/media/sound/RIFFReader.java       |   1 +
 .../com/sun/media/sound/RIFFWriter.java       |  36 +++-
 .../sun/media/sound/RealTimeSequencer.java    | 194 +++++++++---------
 .../media/sound/ReferenceCountingDevice.java  |   6 +-
 .../com/sun/media/sound/SF2GlobalRegion.java  |   1 +
 .../com/sun/media/sound/SF2Instrument.java    |  14 +-
 .../sun/media/sound/SF2InstrumentRegion.java  |   1 +
 .../classes/com/sun/media/sound/SF2Layer.java |   5 +-
 .../com/sun/media/sound/SF2LayerRegion.java   |   1 +
 .../com/sun/media/sound/SF2Modulator.java     |   1 +
 .../com/sun/media/sound/SF2Region.java        |   5 +-
 .../com/sun/media/sound/SF2Sample.java        |   4 +
 .../com/sun/media/sound/SF2Soundbank.java     |  40 ++--
 .../sun/media/sound/SF2SoundbankReader.java   |   5 +
 .../com/sun/media/sound/SimpleInstrument.java |   9 +-
 .../com/sun/media/sound/SimpleSoundbank.java  |  14 +-
 .../media/sound/SoftAbstractResampler.java    |  10 +-
 .../com/sun/media/sound/SoftAudioBuffer.java  |   2 +-
 .../sun/media/sound/SoftAudioProcessor.java   |  16 +-
 .../com/sun/media/sound/SoftAudioPusher.java  |   3 +-
 .../com/sun/media/sound/SoftChannel.java      |  74 +++++--
 .../com/sun/media/sound/SoftChannelProxy.java |  27 +++
 .../com/sun/media/sound/SoftChorus.java       |  10 +-
 .../com/sun/media/sound/SoftControl.java      |   3 +-
 .../sun/media/sound/SoftCubicResampler.java   |   7 +-
 .../media/sound/SoftEnvelopeGenerator.java    |   6 +-
 .../com/sun/media/sound/SoftFilter.java       |   1 +
 .../com/sun/media/sound/SoftInstrument.java   |   2 +
 .../sun/media/sound/SoftJitterCorrector.java  |  11 +-
 .../sun/media/sound/SoftLanczosResampler.java |   7 +-
 .../com/sun/media/sound/SoftLimiter.java      |  10 +-
 .../sun/media/sound/SoftLinearResampler.java  |   8 +-
 .../sun/media/sound/SoftLinearResampler2.java |   6 +-
 .../sound/SoftLowFrequencyOscillator.java     |   5 +
 .../com/sun/media/sound/SoftMainMixer.java    |  34 +--
 .../media/sound/SoftMidiAudioFileReader.java  |   2 +-
 .../com/sun/media/sound/SoftMixingClip.java   |  31 ++-
 .../sun/media/sound/SoftMixingDataLine.java   |  29 ++-
 .../sun/media/sound/SoftMixingMainMixer.java  |  10 +-
 .../com/sun/media/sound/SoftMixingMixer.java  |  36 +++-
 .../media/sound/SoftMixingMixerProvider.java  |   7 +-
 .../media/sound/SoftMixingSourceDataLine.java |  35 +++-
 .../com/sun/media/sound/SoftPerformer.java    |  18 +-
 .../sun/media/sound/SoftPointResampler.java   |   8 +-
 .../com/sun/media/sound/SoftProcess.java      |  12 +-
 .../com/sun/media/sound/SoftReceiver.java     |   4 +
 .../com/sun/media/sound/SoftResampler.java    |   3 +-
 .../media/sound/SoftResamplerStreamer.java    |   4 +-
 .../com/sun/media/sound/SoftReverb.java       |  18 +-
 .../com/sun/media/sound/SoftShortMessage.java |   4 +
 .../sun/media/sound/SoftSincResampler.java    |   8 +-
 .../com/sun/media/sound/SoftSynthesizer.java  |  81 +++++---
 .../com/sun/media/sound/SoftTuning.java       |   1 +
 .../com/sun/media/sound/SoftVoice.java        |  29 +--
 .../media/sound/StandardMidiFileReader.java   |  12 +-
 .../media/sound/StandardMidiFileWriter.java   |  14 +-
 .../classes/com/sun/media/sound/SunCodec.java |   8 +-
 .../com/sun/media/sound/SunFileWriter.java    |  10 +-
 .../classes/com/sun/media/sound/Toolkit.java  |   7 -
 .../com/sun/media/sound/UlawCodec.java        |  32 +--
 .../media/sound/WaveExtensibleFileReader.java |   4 +-
 .../com/sun/media/sound/WaveFileFormat.java   |   2 +-
 .../com/sun/media/sound/WaveFileWriter.java   |   6 +-
 .../sun/media/sound/WaveFloatFileWriter.java  |   2 +-
 .../classes/javax/sound/midi/MetaMessage.java |   1 +
 .../classes/javax/sound/midi/MidiDevice.java  |  12 +-
 .../javax/sound/midi/MidiFileFormat.java      |   4 +-
 .../classes/javax/sound/midi/MidiMessage.java |   1 +
 .../classes/javax/sound/midi/Receiver.java    |   1 +
 .../classes/javax/sound/midi/Sequence.java    |   2 +-
 .../classes/javax/sound/midi/Sequencer.java   |   6 +-
 .../javax/sound/midi/ShortMessage.java        |   1 +
 .../javax/sound/midi/SysexMessage.java        |   2 +
 .../share/classes/javax/sound/midi/Track.java |   7 +-
 .../classes/javax/sound/midi/Transmitter.java |   1 +
 .../javax/sound/sampled/AudioFileFormat.java  |  10 +-
 .../javax/sound/sampled/AudioFormat.java      |   4 +-
 .../javax/sound/sampled/AudioInputStream.java |   2 +-
 .../javax/sound/sampled/CompoundControl.java  |   2 +-
 .../classes/javax/sound/sampled/Control.java  |   2 +-
 .../javax/sound/sampled/EnumControl.java      |   2 +-
 .../javax/sound/sampled/FloatControl.java     |   9 +-
 .../javax/sound/sampled/LineEvent.java        |   3 +-
 .../classes/javax/sound/sampled/Port.java     |  11 +-
 .../javax/sound/sampled/ReverbType.java       |  12 +-
 160 files changed, 1369 insertions(+), 1031 deletions(-)

diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
index b0f85799049..96ca26c7b5b 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
@@ -32,7 +32,6 @@ import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineUnavailableException;
 
-
 /**
  * AbstractDataLine
  *
@@ -147,36 +146,35 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         }
     }
 
-
     public final void open(AudioFormat format) throws LineUnavailableException {
         open(format, AudioSystem.NOT_SPECIFIED);
     }
 
-
     /**
      * This implementation always returns 0.
      */
+    @Override
     public int available() {
         return 0;
     }
 
-
     /**
      * This implementation does nothing.
      */
+    @Override
     public void drain() {
         if (Printer.trace) Printer.trace("AbstractDataLine: drain");
     }
 
-
     /**
      * This implementation does nothing.
      */
+    @Override
     public void flush() {
         if (Printer.trace) Printer.trace("AbstractDataLine: flush");
     }
 
-
+    @Override
     public final void start() {
         //$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
         synchronized(mixer) {
@@ -200,7 +198,7 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         if (Printer.trace) Printer.trace("< "+getClass().getName()+".start() - AbstractDataLine");
     }
 
-
+    @Override
     public final void stop() {
 
         //$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
@@ -245,15 +243,17 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
     // in MixerSourceLine and MixerClip, and I want to touch as little
     // code as possible to change isStarted() back to isRunning().
 
+    @Override
     public final boolean isRunning() {
         return started;
     }
 
+    @Override
     public final boolean isActive() {
         return active;
     }
 
-
+    @Override
     public final long getMicrosecondPosition() {
 
         long microseconds = getLongFramePosition();
@@ -263,12 +263,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         return microseconds;
     }
 
-
+    @Override
     public final AudioFormat getFormat() {
         return format;
     }
 
-
+    @Override
     public final int getBufferSize() {
         return bufferSize;
     }
@@ -283,11 +283,11 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
     /**
      * This implementation returns AudioSystem.NOT_SPECIFIED.
      */
+    @Override
     public final float getLevel() {
         return (float)AudioSystem.NOT_SPECIFIED;
     }
 
-
     // HELPER METHODS
 
     /**
@@ -317,19 +317,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
 
         synchronized (this) {
 
-            //if (Printer.debug) Printer.debug("    AbstractDataLine: setActive: this.active: " + this.active);
-            //if (Printer.debug) Printer.debug("                                 active: " + active);
-
             if (this.active != active) {
                 this.active = active;
                 //sendEvents = true;
             }
         }
 
-        //if (Printer.debug) Printer.debug("                                 this.active: " + this.active);
-        //if (Printer.debug) Printer.debug("                                 sendEvents: " + sendEvents);
-
-
         // $$kk: 11.19.99: take ACTIVE / INACTIVE / EOM events out;
         // putting them in is technically an API change.
         // do not generate ACTIVE / INACTIVE events for now
@@ -356,18 +349,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
 
         synchronized (this) {
 
-            //if (Printer.debug) Printer.debug("    AbstractDataLine: setStarted: this.started: " + this.started);
-            //if (Printer.debug) Printer.debug("                                  started: " + started);
-
             if (this.started != started) {
                 this.started = started;
                 sendEvents = true;
             }
         }
 
-        //if (Printer.debug) Printer.debug("                                  this.started: " + this.started);
-        //if (Printer.debug) Printer.debug("                                  sendEvents: " + sendEvents);
-
         if (sendEvents) {
 
             if (started) {
@@ -379,7 +366,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         if (Printer.trace) Printer.trace("< AbstractDataLine: setStarted completed");
     }
 
-
     /**
      * This method generates a STOP event and sets the started state to false.
      * It is here for historic reasons when an EOM event existed.
@@ -393,9 +379,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         if (Printer.trace) Printer.trace("< AbstractDataLine: setEOM() completed");
     }
 
-
-
-
     // OVERRIDES OF ABSTRACT LINE METHODS
 
     /**
@@ -404,6 +387,7 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
      * line is open, this should return quietly because the values
      * requested will match the current ones.
      */
+    @Override
     public final void open() throws LineUnavailableException {
 
         if (Printer.trace) Printer.trace("> "+getClass().getName()+".open() - AbstractDataLine");
@@ -413,11 +397,11 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         if (Printer.trace) Printer.trace("< "+getClass().getName()+".open() - AbstractDataLine");
     }
 
-
     /**
      * This should also stop the line.  The closed line should not be running or active.
      * After we close the line, we reset the format and buffer size to the defaults.
      */
+    @Override
     public final void close() {
         //$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
         synchronized (mixer) {
@@ -445,12 +429,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
         if (Printer.trace) Printer.trace("< "+getClass().getName()+".close() - in AbstractDataLine");
     }
 
-
-    // IMPLEMENTATIONS OF ABSTRACT LINE ABSTRACE METHODS
-
-
-    // ABSTRACT METHODS
-
     abstract void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException;
     abstract void implClose();
 
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
index 6c349b968e8..53738c13353 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
@@ -36,7 +36,6 @@ import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineListener;
 import javax.sound.sampled.LineUnavailableException;
 
-
 /**
  * AbstractLine
  *
@@ -72,19 +71,19 @@ abstract class AbstractLine implements Line {
         this.controls = controls;
     }
 
-
     // LINE METHODS
 
+    @Override
     public final Line.Info getLineInfo() {
         return info;
     }
 
-
+    @Override
     public final boolean isOpen() {
         return open;
     }
 
-
+    @Override
     public final void addLineListener(LineListener listener) {
         synchronized(listeners) {
             if ( ! (listeners.contains(listener)) ) {
@@ -93,22 +92,22 @@ abstract class AbstractLine implements Line {
         }
     }
 
-
     /**
      * Removes an audio listener.
      * @param listener listener to remove
      */
+    @Override
     public final void removeLineListener(LineListener listener) {
         listeners.removeElement(listener);
     }
 
-
     /**
      * Obtains the set of controls supported by the
      * line.  If no controls are supported, returns an
      * array of length 0.
      * @return control set
      */
+    @Override
     public final Control[] getControls() {
         Control[] returnedArray = new Control[controls.length];
 
@@ -119,7 +118,7 @@ abstract class AbstractLine implements Line {
         return returnedArray;
     }
 
-
+    @Override
     public final boolean isControlSupported(Control.Type controlType) {
         // protect against a NullPointerException
         if (controlType == null) {
@@ -135,7 +134,7 @@ abstract class AbstractLine implements Line {
         return false;
     }
 
-
+    @Override
     public final Control getControl(Control.Type controlType) {
         // protect against a NullPointerException
         if (controlType != null) {
@@ -150,10 +149,8 @@ abstract class AbstractLine implements Line {
         throw new IllegalArgumentException("Unsupported control type: " + controlType);
     }
 
-
     // HELPER METHODS
 
-
     /**
      * This method sets the open state and generates
      * events if it changes.
@@ -182,7 +179,6 @@ abstract class AbstractLine implements Line {
         if (Printer.trace) Printer.trace("< "+getClass().getName()+" (AbstractLine): setOpen(" + open + ")  this.open: " + this.open);
     }
 
-
     /**
      * Send line events.
      */
@@ -190,7 +186,6 @@ abstract class AbstractLine implements Line {
         getEventDispatcher().sendAudioEvents(event, listeners);
     }
 
-
     /**
      * This is an error in the API: getFramePosition
      * should return a long value. At CD quality,
@@ -200,7 +195,6 @@ abstract class AbstractLine implements Line {
         return (int) getLongFramePosition();
     }
 
-
     /**
      * Return the frame position in a long value
      * This implementation returns AudioSystem.NOT_SPECIFIED.
@@ -209,7 +203,6 @@ abstract class AbstractLine implements Line {
         return AudioSystem.NOT_SPECIFIED;
     }
 
-
     // $$kk: 06.03.99: returns the mixer used in construction.
     // this is a hold-over from when there was a public method like
     // this on line and should be fixed!!
@@ -232,8 +225,8 @@ abstract class AbstractLine implements Line {
         }
     }
 
-    // ABSTRACT METHODS
-
+    @Override
     public abstract void open() throws LineUnavailableException;
+    @Override
     public abstract void close();
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
index e9cab2c2fa4..672b76f926b 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
@@ -26,10 +26,17 @@
 package com.sun.media.sound;
 
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Collections;
+import java.util.List;
 
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiDeviceTransmitter;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
 
 
 /**
@@ -43,11 +50,8 @@ import javax.sound.midi.*;
  */
 abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice {
 
-    // STATIC VARIABLES
     private static final boolean TRACE_TRANSMITTER = false;
 
-    // INSTANCE VARIABLES
-
     private ArrayList receiverList;
 
     private TransmitterList transmitterList;
@@ -62,7 +66,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
 
     private final MidiDevice.Info info;
 
-
     // DEVICE STATE
 
     private volatile boolean open;
@@ -73,15 +76,10 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
     private List openKeepingObjects;
 
     /**
-     * This is the device handle returned from native code
+     * This is the device handle returned from native code.
      */
     protected volatile long id;
 
-
-
-    // CONSTRUCTOR
-
-
     /**
      * Constructs an AbstractMidiDevice with the specified info object.
      * @param info the description of the device
@@ -99,9 +97,9 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if(Printer.trace) Printer.trace("<< AbstractMidiDevice CONSTRUCTOR completed");
     }
 
-
     // MIDI DEVICE METHODS
 
+    @Override
     public final MidiDevice.Info getDeviceInfo() {
         return info;
     }
@@ -111,6 +109,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
      * opened the device implicitly from closing it. The only way to close the device after
      * this call is a call to close().
      */
+    @Override
     public final void open() throws MidiUnavailableException {
         if (Printer.trace) Printer.trace("> AbstractMidiDevice: open()");
         synchronized(this) {
@@ -120,8 +119,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: open() completed");
     }
 
-
-
     /** Open the device implicitly.
      * This method is intended to be used by AbstractReceiver
      * and BasicTransmitter. Actually, it is called by getReceiverReferenceCounting() and
@@ -146,7 +143,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: openInternal() completed");
     }
 
-
     private void doOpen() throws MidiUnavailableException {
         if (Printer.trace) Printer.trace("> AbstractMidiDevice: doOpen()");
         synchronized(this) {
@@ -158,7 +154,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: doOpen() completed");
     }
 
-
+    @Override
     public final void close() {
         if (Printer.trace) Printer.trace("> AbstractMidiDevice: close()");
         synchronized (this) {
@@ -168,7 +164,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: close() completed");
     }
 
-
     /** Close the device for an object that implicitely opened it.
      * This method is intended to be used by Transmitter.close() and Receiver.close().
      * Those methods should pass this for the object parameter. Since Transmitters or Receivers
@@ -196,7 +191,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: closeInternal() completed");
     }
 
-
     public final void doClose() {
         if (Printer.trace) Printer.trace("> AbstractMidiDevice: doClose()");
         synchronized(this) {
@@ -208,12 +202,11 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         if (Printer.trace) Printer.trace("< AbstractMidiDevice: doClose() completed");
     }
 
-
+    @Override
     public final boolean isOpen() {
         return open;
     }
 
-
     protected void implClose() {
         synchronized (traRecLock) {
             if (receiverList != null) {
@@ -230,21 +223,21 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         }
     }
 
-
     /**
      * This implementation always returns -1.
      * Devices that actually provide this should over-ride
      * this method.
      */
+    @Override
     public long getMicrosecondPosition() {
         return -1;
     }
 
-
     /** Return the maximum number of Receivers supported by this device.
         Depending on the return value of hasReceivers(), this method returns either 0 or -1.
         Subclasses should rather override hasReceivers() than override this method.
      */
+    @Override
     public final int getMaxReceivers() {
         if (hasReceivers()) {
             return -1;
@@ -253,11 +246,11 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         }
     }
 
-
     /** Return the maximum number of Transmitters supported by this device.
         Depending on the return value of hasTransmitters(), this method returns either 0 or -1.
         Subclasses should override hasTransmitters().
      */
+    @Override
     public final int getMaxTransmitters() {
         if (hasTransmitters()) {
             return -1;
@@ -266,7 +259,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         }
     }
 
-
     /** Retrieve a Receiver for this device.
         This method returns the value returned by createReceiver(), if it doesn't throw
         an exception. Subclasses should rather override createReceiver() than override
@@ -274,6 +266,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         If createReceiver returns a Receiver, it is added to the internal list
         of Receivers (see getReceiversList)
      */
+    @Override
     public final Receiver getReceiver() throws MidiUnavailableException {
         Receiver receiver;
         synchronized (traRecLock) {
@@ -283,7 +276,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return receiver;
     }
 
-
+    @Override
     @SuppressWarnings("unchecked") // Cast of result of clone
     public final List getReceivers() {
         List recs;
@@ -298,12 +291,12 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return recs;
     }
 
-
     /**
      * This implementation uses createTransmitter, which may throw an exception.
      * If a transmitter is returned in createTransmitter, it is added to the internal
      * TransmitterList
      */
+    @Override
     public final Transmitter getTransmitter() throws MidiUnavailableException {
         Transmitter transmitter;
         synchronized (traRecLock) {
@@ -313,7 +306,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return transmitter;
     }
 
-
+    @Override
     @SuppressWarnings("unchecked") // Cast of result of clone
     public final List getTransmitters() {
         List tras;
@@ -328,19 +321,16 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return tras;
     }
 
-
-    // HELPER METHODS
-
     final long getId() {
         return id;
     }
 
-
     // REFERENCE COUNTING
 
     /** Retrieve a Receiver and open the device implicitly.
         This method is called by MidiSystem.getReceiver().
      */
+    @Override
     public final Receiver getReceiverReferenceCounting()
             throws MidiUnavailableException {
         /* Keep this order of commands! If getReceiver() throws an exception,
@@ -354,10 +344,10 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return receiver;
     }
 
-
     /** Retrieve a Transmitter and open the device implicitly.
         This method is called by MidiSystem.getTransmitter().
      */
+    @Override
     public final Transmitter getTransmitterReferenceCounting()
             throws MidiUnavailableException {
         /* Keep this order of commands! If getTransmitter() throws an exception,
@@ -371,7 +361,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return transmitter;
     }
 
-
     /** Return the list of objects that have opened the device implicitely.
      */
     private synchronized List getOpenKeepingObjects() {
@@ -381,23 +370,19 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return openKeepingObjects;
     }
 
-
-
     // RECEIVER HANDLING METHODS
 
-
     /** Return the internal list of Receivers, possibly creating it first.
      */
     private List getReceiverList() {
         synchronized (traRecLock) {
             if (receiverList == null) {
-                receiverList = new ArrayList();
+                receiverList = new ArrayList<>();
             }
         }
         return receiverList;
     }
 
-
     /** Returns if this device supports Receivers.
         Subclasses that use Receivers should override this method to
         return true. They also should override createReceiver().
@@ -408,7 +393,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return false;
     }
 
-
     /** Create a Receiver object.
         throwing an exception here means that Receivers aren't enabled.
         Subclasses that use Receivers should override this method with
@@ -420,8 +404,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         throw new MidiUnavailableException("MIDI IN receiver not available");
     }
 
-
-
     // TRANSMITTER HANDLING
 
     /** Return the internal list of Transmitters, possibly creating it first.
@@ -435,7 +417,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return transmitterList;
     }
 
-
     /** Returns if this device supports Transmitters.
         Subclasses that use Transmitters should override this method to
         return true. They also should override createTransmitter().
@@ -446,7 +427,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         return false;
     }
 
-
     /** Create a Transmitter object.
         throwing an exception here means that Transmitters aren't enabled.
         Subclasses that use Transmitters should override this method with
@@ -458,20 +438,16 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
         throw new MidiUnavailableException("MIDI OUT transmitter not available");
     }
 
-    // ABSTRACT METHODS
-
     protected abstract void implOpen() throws MidiUnavailableException;
 
-
     /**
-     * close this device if discarded by the garbage collector
+     * close this device if discarded by the garbage collector.
      */
+    @Override
     protected final void finalize() {
         close();
     }
 
-    // INNER CLASSES
-
     /** Base class for Receivers.
         Subclasses that use Receivers must use this base class, since it
         contains magic necessary to manage implicit closing the device.
@@ -550,6 +526,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
             this.tlist = tlist;
         }
 
+        @Override
         public final void setReceiver(Receiver receiver) {
             if (tlist != null && this.receiver != receiver) {
                 if (Printer.debug) Printer.debug("Transmitter "+toString()+": set receiver "+receiver);
@@ -558,16 +535,17 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
             }
         }
 
+        @Override
         public final Receiver getReceiver() {
             return receiver;
         }
 
-
         /** Close the Transmitter.
          * Here, the call to the magic method closeInternal() takes place.
          * Therefore, subclasses that override this method must call
          * 'super.close()'.
          */
+        @Override
         public final void close() {
             AbstractMidiDevice.this.closeInternal(this);
             if (tlist != null) {
@@ -577,19 +555,19 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
             }
         }
 
+        @Override
         public final MidiDevice getMidiDevice() {
             return AbstractMidiDevice.this;
         }
 
     } // class BasicTransmitter
 
-
     /**
-     * a class to manage a list of transmitters
+     * a class to manage a list of transmitters.
      */
     final class TransmitterList {
 
-        private final ArrayList transmitters = new ArrayList();
+        private final ArrayList transmitters = new ArrayList<>();
         private MidiOutDevice.MidiOutReceiver midiOutReceiver;
 
         // how many transmitters must be present for optimized
@@ -712,9 +690,8 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
             }
         }
 
-
         /**
-        * Send this message to all transmitters
+        * Send this message to all transmitters.
         */
         void sendMessage(MidiMessage message, long timeStamp) {
             if (message instanceof FastShortMessage) {
@@ -746,8 +723,5 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
                 }
             }
         }
-
-
     } // TransmitterList
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
index 6ff1ccde6b0..563cb294766 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
@@ -52,7 +52,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
         // also for memory's sake, do not initialize the arrays here
     }
 
-
     final synchronized void readDeviceInfos() {
         Info[] infos = getInfoCache();
         MidiDevice[] devices = getDeviceCache();
@@ -148,10 +147,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
         throw MidiUtils.unsupportedDevice(info);
     }
 
-
-    // INNER CLASSES
-
-
     /**
      * Info class for MidiDevices.  Adds an index value for
      * making native references to a particular device.
@@ -182,9 +177,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
 
     } // class Info
 
-
-    // ABSTRACT METHODS
-
     abstract int getNumDevices();
     abstract MidiDevice[] getDeviceCache();
     abstract void setDeviceCache(MidiDevice[] devices);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
index 83378615b77..7389e8dbeac 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
@@ -28,9 +28,9 @@ package com.sun.media.sound;
 import java.util.Vector;
 
 import javax.sound.sampled.Control;
-import javax.sound.sampled.Mixer;
 import javax.sound.sampled.Line;
 import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.Mixer;
 
 /**
  * Abstract Mixer.  Implements Mixer (with abstract methods) and specifies
@@ -76,29 +76,18 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
      */
     private boolean manuallyOpened = false;
 
-
-    /**
-     * Supported formats for the mixer.
-     */
-    //$$fb DELETE
-    //protected Vector formats = new Vector();
-
-
     // STATE VARIABLES
 
-
     /**
-     * Source lines (ports) currently open
+     * Source lines (ports) currently open.
      */
     private final Vector sourceLines = new Vector<>();
 
-
     /**
      * Target lines currently open.
      */
     private final Vector targetLines = new Vector<>();
 
-
     /**
      * Constructs a new AbstractMixer.
      * @param mixer the mixer with which this line is associated
@@ -124,30 +113,28 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         this.targetLineInfo = targetLineInfo;
     }
 
-
     // MIXER METHODS
 
-
+    @Override
     public final Mixer.Info getMixerInfo() {
         return mixerInfo;
     }
 
-
+    @Override
     public final Line.Info[] getSourceLineInfo() {
         Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
         System.arraycopy(sourceLineInfo, 0, localArray, 0, sourceLineInfo.length);
         return localArray;
     }
 
-
+    @Override
     public final Line.Info[] getTargetLineInfo() {
-
         Line.Info[] localArray = new Line.Info[targetLineInfo.length];
         System.arraycopy(targetLineInfo, 0, localArray, 0, targetLineInfo.length);
         return localArray;
     }
 
-
+    @Override
     public final Line.Info[] getSourceLineInfo(Line.Info info) {
 
         int i;
@@ -168,7 +155,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return returnedArray;
     }
 
-
+    @Override
     public final Line.Info[] getTargetLineInfo(Line.Info info) {
 
         int i;
@@ -189,7 +176,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return returnedArray;
     }
 
-
+    @Override
     public final boolean isLineSupported(Line.Info info) {
 
         int i;
@@ -211,9 +198,10 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return false;
     }
 
-
+    @Override
     public abstract Line getLine(Line.Info info) throws LineUnavailableException;
 
+    @Override
     public abstract int getMaxLines(Line.Info info);
 
     protected abstract void implOpen() throws LineUnavailableException;
@@ -221,7 +209,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
     protected abstract void implStop();
     protected abstract void implClose();
 
-
+    @Override
     public final Line[] getSourceLines() {
 
         Line[] localLines;
@@ -238,7 +226,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return localLines;
     }
 
-
+    @Override
     public final Line[] getTargetLines() {
 
         Line[] localLines;
@@ -255,37 +243,37 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return localLines;
     }
 
-
     /**
      * Default implementation always throws an exception.
      */
+    @Override
     public final void synchronize(Line[] lines, boolean maintainSync) {
         throw new IllegalArgumentException("Synchronization not supported by this mixer.");
     }
 
-
     /**
      * Default implementation always throws an exception.
      */
+    @Override
     public final void unsynchronize(Line[] lines) {
         throw new IllegalArgumentException("Synchronization not supported by this mixer.");
     }
 
-
     /**
      * Default implementation always returns false.
      */
+    @Override
     public final boolean isSynchronizationSupported(Line[] lines,
                                                     boolean maintainSync) {
         return false;
     }
 
-
     // OVERRIDES OF ABSTRACT DATA LINE METHODS
 
     /**
      * This implementation tries to open the mixer with its current format and buffer size settings.
      */
+    @Override
     public final synchronized void open() throws LineUnavailableException {
         open(true);
     }
@@ -307,10 +295,8 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         if (Printer.trace) Printer.trace("<< AbstractMixer: open() succeeded");
     }
 
-
     // METHOD FOR INTERNAL IMPLEMENTATION USE
 
-
     /**
      * The default implementation of this method just determines whether
      * this line is a source or target line, calls open(no-arg) on the
@@ -357,7 +343,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         if (Printer.trace) Printer.trace("<< AbstractMixer: open(" + line + ") completed");
     }
 
-
     /**
      * Removes this line from the list of open source lines and
      * open target lines, if it exists in either.
@@ -388,10 +373,10 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         if (Printer.trace) Printer.trace("<< AbstractMixer: close(" + line + ") succeeded");
     }
 
-
     /**
      * Close all lines and then close this mixer.
      */
+    @Override
     public final synchronized void close() {
         if (Printer.trace) Printer.trace(">> AbstractMixer: close()");
         if (isOpen()) {
@@ -439,7 +424,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         if (Printer.trace) Printer.trace("<< AbstractMixer: start(" + line + ") succeeded");
     }
 
-
     /**
      * Stops the mixer if this was the last running line.
      */
@@ -492,8 +476,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") succeeded");
     }
 
-
-
     /**
      * Determines whether this is a source line for this mixer.
      * Right now this just checks whether it's supported, but should
@@ -510,7 +492,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return false;
     }
 
-
     /**
      * Determines whether this is a target line for this mixer.
      * Right now this just checks whether it's supported, but should
@@ -527,7 +508,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
         return false;
     }
 
-
     /**
      * Returns the first complete Line.Info object it finds that
      * matches the one specified, or null if no matching Line.Info
@@ -551,8 +531,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
                 return targetLineInfo[i];
             }
         }
-
         return null;
     }
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
index 010bd3d4b56..c7e4ccce344 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
@@ -87,5 +87,4 @@ final class AiffFileFormat extends StandardFileFormat {
     int getSsndChunkOffset() {
         return getHeaderSize()-16;
     }
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
index 20dc68409ff..c8d9cd8d2db 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
@@ -29,7 +29,6 @@ import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.sound.sampled.AudioFileFormat;
 import javax.sound.sampled.AudioFileFormat.Type;
 import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioSystem;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
index e117348dbdf..30dd2e8d726 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
@@ -33,7 +33,6 @@ import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
 
-
 /**
  * A-law encodes linear data, and decodes a-law data to linear data.
  *
@@ -52,7 +51,7 @@ public final class AlawCodec extends SunCodec {
                                              0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
 
     /**
-     * Initializes the decode tables
+     * Initializes the decode tables.
      */
     static {
         for (int i=0;i<256;i++) {
@@ -83,10 +82,7 @@ public final class AlawCodec extends SunCodec {
         super(alawEncodings, alawEncodings);
     }
 
-    // NEW CODE
-
-    /**
-     */
+    @Override
     public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat){
 
         if( sourceFormat.getEncoding().equals( AudioFormat.Encoding.PCM_SIGNED )) {
@@ -117,8 +113,7 @@ public final class AlawCodec extends SunCodec {
         }
     }
 
-    /**
-     */
+    @Override
     public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){
         Objects.requireNonNull(sourceFormat);
         if( (targetEncoding.equals( AudioFormat.Encoding.PCM_SIGNED ) && sourceFormat.getEncoding().equals( AudioFormat.Encoding.ALAW)) ||
@@ -129,8 +124,7 @@ public final class AlawCodec extends SunCodec {
             }
     }
 
-    /**
-     */
+    @Override
     public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream){
         AudioFormat sourceFormat = sourceStream.getFormat();
         AudioFormat.Encoding sourceEncoding = sourceFormat.getEncoding();
@@ -169,9 +163,7 @@ public final class AlawCodec extends SunCodec {
         return getConvertedStream(targetFormat, sourceStream);
     }
 
-    /**
-     * use old code...
-     */
+    @Override
     public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){
         if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
             throw new IllegalArgumentException("Unsupported conversion: "
@@ -180,10 +172,6 @@ public final class AlawCodec extends SunCodec {
         return getConvertedStream( targetFormat, sourceStream );
     }
 
-
-    // OLD CODE
-
-
     /**
      * Opens the codec with the specified parameters.
      * @param stream stream from which data to be processed should be read
@@ -192,7 +180,6 @@ public final class AlawCodec extends SunCodec {
      * @throws IllegalArgumentException if the format combination supplied is
      * not supported.
      */
-    /*  public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { */
     private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {
 
         AudioInputStream cs = null;
@@ -201,7 +188,7 @@ public final class AlawCodec extends SunCodec {
         if( inputFormat.matches(outputFormat) ) {
             cs = stream;
         } else {
-            cs = (AudioInputStream) (new AlawCodecStream(stream, outputFormat));
+            cs = new AlawCodecStream(stream, outputFormat);
         }
 
         return cs;
@@ -214,7 +201,6 @@ public final class AlawCodec extends SunCodec {
      * returns an array of length 0.
      * @return array of supported output formats.
      */
-    /*  public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */
     private AudioFormat[] getOutputFormats(AudioFormat inputFormat) {
 
 
@@ -343,18 +329,20 @@ public final class AlawCodec extends SunCodec {
          * Note that this won't actually read anything; must read in
          * two-byte units.
          */
+        @Override
         public int read() throws IOException {
 
             byte[] b = new byte[1];
             return read(b, 0, b.length);
         }
 
-
+        @Override
         public int read(byte[] b) throws IOException {
 
             return read(b, 0, b.length);
         }
 
+        @Override
         public int read(byte[] b, int off, int len) throws IOException {
 
             // don't read fractional frames
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
index 11b0fa6ee6e..de9d124753f 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
@@ -45,6 +45,7 @@ import javax.sound.sampled.UnsupportedAudioFileException;
  */
 public final class AudioFileSoundbankReader extends SoundbankReader {
 
+    @Override
     public Soundbank getSoundbank(URL url)
             throws InvalidMidiDataException, IOException {
         try {
@@ -59,6 +60,7 @@ public final class AudioFileSoundbankReader extends SoundbankReader {
         }
     }
 
+    @Override
     public Soundbank getSoundbank(InputStream stream)
             throws InvalidMidiDataException, IOException {
         stream.mark(512);
@@ -108,6 +110,7 @@ public final class AudioFileSoundbankReader extends SoundbankReader {
         }
     }
 
+    @Override
     public Soundbank getSoundbank(File file)
             throws InvalidMidiDataException, IOException {
         try {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
index 77930d05657..31d7ff51d5e 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
@@ -89,8 +89,9 @@ public abstract class AudioFloatConverter {
                 mask = (byte) 0xFF;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             byte[] ret = converter.toByteArray(in_buff, in_offset, in_len,
                     out_buff, out_offset);
 
@@ -102,8 +103,9 @@ public abstract class AudioFloatConverter {
             return ret;
         }
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             if (mask_buffer == null || mask_buffer.length < in_buff.length)
                 mask_buffer = new byte[in_buff.length];
             System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length);
@@ -132,8 +134,9 @@ public abstract class AudioFloatConverter {
 
         double[] double_buff = null;
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int in_len = out_len * 8;
             if (bytebuffer == null || bytebuffer.capacity() < in_len) {
                 bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -154,8 +157,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int out_len = in_len * 8;
             if (bytebuffer == null || bytebuffer.capacity() < out_len) {
                 bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -184,8 +188,9 @@ public abstract class AudioFloatConverter {
 
         double[] double_buff = null;
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int in_len = out_len * 8;
             if (bytebuffer == null || bytebuffer.capacity() < in_len) {
                 bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -206,8 +211,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int out_len = in_len * 8;
             if (bytebuffer == null || bytebuffer.capacity() < out_len) {
                 bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -240,8 +246,9 @@ public abstract class AudioFloatConverter {
 
         FloatBuffer floatbuffer = null;
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int in_len = out_len * 4;
             if (bytebuffer == null || bytebuffer.capacity() < in_len) {
                 bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -255,8 +262,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int out_len = in_len * 4;
             if (bytebuffer == null || bytebuffer.capacity() < out_len) {
                 bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -277,8 +285,9 @@ public abstract class AudioFloatConverter {
 
         FloatBuffer floatbuffer = null;
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int in_len = out_len * 4;
             if (bytebuffer == null || bytebuffer.capacity() < in_len) {
                 bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -292,8 +301,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int out_len = in_len * 4;
             if (bytebuffer == null || bytebuffer.capacity() < out_len) {
                 bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -316,8 +326,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 8 bit, signed
     private static class AudioFloatConversion8S extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -327,8 +338,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -341,8 +353,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 8 bit, unsigned
     private static class AudioFloatConversion8U extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -352,8 +365,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -372,8 +386,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 16 bit, signed, little-endian
     private static class AudioFloatConversion16SL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int len = out_offset + out_len;
             for (int ox = out_offset; ox < len; ox++) {
@@ -383,8 +398,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ox = out_offset;
             int len = in_offset + in_len;
             for (int ix = in_offset; ix < len; ix++) {
@@ -399,8 +415,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 16 bit, signed, big-endian
     private static class AudioFloatConversion16SB extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -410,8 +427,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -426,8 +444,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 16 bit, unsigned, little-endian
     private static class AudioFloatConversion16UL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -438,8 +457,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -454,8 +474,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 16 bit, unsigned, big-endian
     private static class AudioFloatConversion16UB extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -466,8 +487,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -488,8 +510,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 24 bit, signed, little-endian
     private static class AudioFloatConversion24SL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -502,8 +525,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -521,8 +545,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 24 bit, signed, big-endian
     private static class AudioFloatConversion24SB extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -535,8 +560,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -554,8 +580,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 24 bit, unsigned, little-endian
     private static class AudioFloatConversion24UL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -567,8 +594,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -585,8 +613,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 24 bit, unsigned, big-endian
     private static class AudioFloatConversion24UB extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -598,8 +627,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -622,8 +652,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 32 bit, signed, little-endian
     private static class AudioFloatConversion32SL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -635,8 +666,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -652,8 +684,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 32 bit, signed, big-endian
     private static class AudioFloatConversion32SB extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -665,8 +698,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -682,8 +716,9 @@ public abstract class AudioFloatConverter {
 
     // PCM 32 bit, unsigned, little-endian
     private static class AudioFloatConversion32UL extends AudioFloatConverter {
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -696,8 +731,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -715,8 +751,9 @@ public abstract class AudioFloatConverter {
     // PCM 32 bit, unsigned, big-endian
     private static class AudioFloatConversion32UB extends AudioFloatConverter {
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -729,8 +766,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -760,8 +798,9 @@ public abstract class AudioFloatConverter {
             this.xbytes = xbytes;
         }
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -774,8 +813,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -801,8 +841,9 @@ public abstract class AudioFloatConverter {
             this.xbytes = xbytes;
         }
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -816,8 +857,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -843,8 +885,9 @@ public abstract class AudioFloatConverter {
             this.xbytes = xbytes;
         }
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -858,8 +901,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
@@ -886,8 +930,9 @@ public abstract class AudioFloatConverter {
             this.xbytes = xbytes;
         }
 
+        @Override
         public float[] toFloatArray(byte[] in_buff, int in_offset,
-                float[] out_buff, int out_offset, int out_len) {
+                                    float[] out_buff, int out_offset, int out_len) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < out_len; i++) {
@@ -901,8 +946,9 @@ public abstract class AudioFloatConverter {
             return out_buff;
         }
 
+        @Override
         public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
-                byte[] out_buff, int out_offset) {
+                                  byte[] out_buff, int out_offset) {
             int ix = in_offset;
             int ox = out_offset;
             for (int i = 0; i < in_len; i++) {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
index 21ee186cb71..d28729fd7c5 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
@@ -32,9 +32,9 @@ import java.util.Arrays;
 import java.util.Objects;
 
 import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
 import javax.sound.sampled.spi.FormatConversionProvider;
 
 /**
@@ -63,6 +63,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             fsize = ((targetFormat.getSampleSizeInBits() + 7) / 8);
         }
 
+        @Override
         public int read() throws IOException {
             byte[] b = new byte[1];
             int ret = read(b);
@@ -71,6 +72,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             return b[0] & 0xFF;
         }
 
+        @Override
         public int read(byte[] b, int off, int len) throws IOException {
 
             int flen = len / fsize;
@@ -83,6 +85,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             return ret * fsize;
         }
 
+        @Override
         public int available() throws IOException {
             int ret = stream.available();
             if (ret < 0)
@@ -90,22 +93,27 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             return ret * fsize;
         }
 
+        @Override
         public void close() throws IOException {
             stream.close();
         }
 
+        @Override
         public synchronized void mark(int readlimit) {
             stream.mark(readlimit * fsize);
         }
 
+        @Override
         public boolean markSupported() {
             return stream.markSupported();
         }
 
+        @Override
         public synchronized void reset() throws IOException {
             stream.reset();
         }
 
+        @Override
         public long skip(long n) throws IOException {
             long ret = stream.skip(n / fsize);
             if (ret < 0)
@@ -141,30 +149,37 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
                             .isBigEndian());
         }
 
+        @Override
         public int available() throws IOException {
             return (ais.available() / sourceChannels) * targetChannels;
         }
 
+        @Override
         public void close() throws IOException {
             ais.close();
         }
 
+        @Override
         public AudioFormat getFormat() {
             return targetFormat;
         }
 
+        @Override
         public long getFrameLength() {
             return ais.getFrameLength();
         }
 
+        @Override
         public void mark(int readlimit) {
             ais.mark((readlimit / targetChannels) * sourceChannels);
         }
 
+        @Override
         public boolean markSupported() {
             return ais.markSupported();
         }
 
+        @Override
         public int read(float[] b, int off, int len) throws IOException {
             int len2 = (len / targetChannels) * sourceChannels;
             if (conversion_buffer == null || conversion_buffer.length < len2)
@@ -212,10 +227,12 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             return (ret / sourceChannels) * targetChannels;
         }
 
+        @Override
         public void reset() throws IOException {
             ais.reset();
         }
 
+        @Override
         public long skip(long len) throws IOException {
             long ret = ais.skip((len / targetChannels) * sourceChannels);
             if (ret < 0)
@@ -305,22 +322,27 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             ibuffer_len = buffer_len;
         }
 
+        @Override
         public int available() throws IOException {
             return 0;
         }
 
+        @Override
         public void close() throws IOException {
             ais.close();
         }
 
+        @Override
         public AudioFormat getFormat() {
             return targetFormat;
         }
 
+        @Override
         public long getFrameLength() {
             return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength();
         }
 
+        @Override
         public void mark(int readlimit) {
             ais.mark((int) (readlimit * pitch[0]));
             mark_ibuffer_index = ibuffer_index;
@@ -337,6 +359,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             }
         }
 
+        @Override
         public boolean markSupported() {
             return ais.markSupported();
         }
@@ -381,6 +404,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
 
         }
 
+        @Override
         public int read(float[] b, int off, int len) throws IOException {
 
             if (cbuffer == null || cbuffer[0].length < len / nrofchannels) {
@@ -431,6 +455,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
             return len - remain * nrofchannels;
         }
 
+        @Override
         public void reset() throws IOException {
             ais.reset();
             if (mark_ibuffer == null)
@@ -447,6 +472,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
 
         }
 
+        @Override
         public long skip(long len) throws IOException {
             if (len < 0)
                 return 0;
@@ -474,8 +500,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
                                         Encoding.PCM_UNSIGNED,
                                         Encoding.PCM_FLOAT};
 
+    @Override
     public AudioInputStream getAudioInputStream(Encoding targetEncoding,
-            AudioInputStream sourceStream) {
+                                                AudioInputStream sourceStream) {
         if (!isConversionSupported(targetEncoding, sourceStream.getFormat())) {
             throw new IllegalArgumentException(
                     "Unsupported conversion: " + sourceStream.getFormat()
@@ -496,8 +523,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
         return getAudioInputStream(targetFormat, sourceStream);
     }
 
+    @Override
     public AudioInputStream getAudioInputStream(AudioFormat targetFormat,
-            AudioInputStream sourceStream) {
+                                                AudioInputStream sourceStream) {
         if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
             throw new IllegalArgumentException("Unsupported conversion: "
                     + sourceStream.getFormat().toString() + " to "
@@ -526,16 +554,19 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
                 .getFrameLength());
     }
 
+    @Override
     public Encoding[] getSourceEncodings() {
         return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
                 Encoding.PCM_FLOAT };
     }
 
+    @Override
     public Encoding[] getTargetEncodings() {
         return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
                 Encoding.PCM_FLOAT };
     }
 
+    @Override
     public Encoding[] getTargetEncodings(AudioFormat sourceFormat) {
         if (AudioFloatConverter.getConverter(sourceFormat) == null)
             return new Encoding[0];
@@ -543,14 +574,15 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
                 Encoding.PCM_FLOAT };
     }
 
+    @Override
     public AudioFormat[] getTargetFormats(Encoding targetEncoding,
-            AudioFormat sourceFormat) {
+                                          AudioFormat sourceFormat) {
         Objects.requireNonNull(targetEncoding);
         if (AudioFloatConverter.getConverter(sourceFormat) == null)
             return new AudioFormat[0];
         int channels = sourceFormat.getChannels();
 
-        ArrayList formats = new ArrayList();
+        ArrayList formats = new ArrayList<>();
 
         if (targetEncoding.equals(Encoding.PCM_SIGNED))
             formats.add(new AudioFormat(Encoding.PCM_SIGNED,
@@ -598,8 +630,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
         return formats.toArray(new AudioFormat[formats.size()]);
     }
 
+    @Override
     public boolean isConversionSupported(AudioFormat targetFormat,
-            AudioFormat sourceFormat) {
+                                         AudioFormat sourceFormat) {
         Objects.requireNonNull(targetFormat);
         if (AudioFloatConverter.getConverter(sourceFormat) == null)
             return false;
@@ -612,8 +645,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
         return true;
     }
 
+    @Override
     public boolean isConversionSupported(Encoding targetEncoding,
-            AudioFormat sourceFormat) {
+                                         AudioFormat sourceFormat) {
         Objects.requireNonNull(targetEncoding);
         if (AudioFloatConverter.getConverter(sourceFormat) == null)
             return false;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
index a4fd10429c4..845312ca409 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.io.ByteArrayInputStream;
@@ -66,14 +67,17 @@ public abstract class AudioFloatInputStream {
 
         }
 
+        @Override
         public AudioFormat getFormat() {
             return format;
         }
 
+        @Override
         public long getFrameLength() {
             return buffer_len;// / format.getFrameSize();
         }
 
+        @Override
         public int read(float[] b, int off, int len) throws IOException {
             if (b == null)
                 throw new NullPointerException();
@@ -91,6 +95,7 @@ public abstract class AudioFloatInputStream {
             return len;
         }
 
+        @Override
         public long skip(long len) throws IOException {
             if (pos >= buffer_len)
                 return -1;
@@ -102,21 +107,26 @@ public abstract class AudioFloatInputStream {
             return len;
         }
 
+        @Override
         public int available() throws IOException {
             return buffer_len - pos;
         }
 
+        @Override
         public void close() throws IOException {
         }
 
+        @Override
         public void mark(int readlimit) {
             markpos = pos;
         }
 
+        @Override
         public boolean markSupported() {
             return true;
         }
 
+        @Override
         public void reset() throws IOException {
             pos = markpos;
         }
@@ -163,14 +173,17 @@ public abstract class AudioFloatInputStream {
             this.stream = stream;
         }
 
+        @Override
         public AudioFormat getFormat() {
             return stream.getFormat();
         }
 
+        @Override
         public long getFrameLength() {
             return stream.getFrameLength();
         }
 
+        @Override
         public int read(float[] b, int off, int len) throws IOException {
             int b_len = len * framesize_pc;
             if (buffer == null || buffer.length < b_len)
@@ -182,6 +195,7 @@ public abstract class AudioFloatInputStream {
             return ret / framesize_pc;
         }
 
+        @Override
         public long skip(long len) throws IOException {
             long b_len = len * framesize_pc;
             long ret = stream.skip(b_len);
@@ -190,22 +204,27 @@ public abstract class AudioFloatInputStream {
             return ret / framesize_pc;
         }
 
+        @Override
         public int available() throws IOException {
             return stream.available() / framesize_pc;
         }
 
+        @Override
         public void close() throws IOException {
             stream.close();
         }
 
+        @Override
         public void mark(int readlimit) {
             stream.mark(readlimit * framesize_pc);
         }
 
+        @Override
         public boolean markSupported() {
             return stream.markSupported();
         }
 
+        @Override
         public void reset() throws IOException {
             stream.reset();
         }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
index 7479357c580..b7d292a57e5 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
@@ -22,9 +22,11 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.util.Map;
+
 import javax.sound.midi.MidiUnavailableException;
 import javax.sound.midi.Synthesizer;
 import javax.sound.sampled.AudioFormat;
@@ -53,7 +55,7 @@ public interface AudioSynthesizer extends Synthesizer {
      * @return current audio data format
      * @see AudioFormat
      */
-    public AudioFormat getFormat();
+    AudioFormat getFormat();
 
     /**
      * Gets information about the possible properties for the synthesizer.
@@ -63,8 +65,7 @@ public interface AudioSynthesizer extends Synthesizer {
      * describing possible properties. This array may be an empty array if
      * no properties are required.
      */
-    public AudioSynthesizerPropertyInfo[] getPropertyInfo(
-            Map info);
+    AudioSynthesizerPropertyInfo[] getPropertyInfo(Map info);
 
     /**
      * Opens the synthesizer and starts rendering audio into
@@ -93,7 +94,7 @@ public interface AudioSynthesizer extends Synthesizer {
      * @see #close
      * @see #isOpen
      */
-    public void open(SourceDataLine line, Map info)
+    void open(SourceDataLine line, Map info)
             throws MidiUnavailableException;
 
     /**
@@ -123,6 +124,7 @@ public interface AudioSynthesizer extends Synthesizer {
      * @see #close
      * @see #isOpen
      */
-    public AudioInputStream openStream(AudioFormat targetFormat,
-            Map info) throws MidiUnavailableException;
+    AudioInputStream openStream(AudioFormat targetFormat,
+                                Map info)
+            throws MidiUnavailableException;
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
index 11f2b7e52c9..6c7272319f7 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
index 02c5119f22e..d0567ca3001 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
@@ -28,7 +28,7 @@ package com.sun.media.sound;
 import javax.sound.sampled.Clip;
 
 /**
- * Interface for Clip objects that close themselves automatically
+ * Interface for Clip objects that close themselves automatically.
  *
  * @author Florian Bomers
  */
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
index 70df345586c..4dc8a107fe1 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
@@ -41,6 +41,5 @@ public interface AutoConnectSequencer {
      * needs to re-connect itself to a suitable
      * device in open().
      */
-    public void setAutoConnect(Receiver autoConnectReceiver);
-
+    void setAutoConnect(Receiver autoConnectReceiver);
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
index 708bf4b04ca..c25be39d290 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
index c7e6188a25c..c4f45e49cb1 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.util.ArrayList;
@@ -47,8 +48,8 @@ public final class DLSInstrument extends ModelInstrument {
     boolean druminstrument = false;
     byte[] guid = null;
     DLSInfo info = new DLSInfo();
-    List regions = new ArrayList();
-    List modulators = new ArrayList();
+    List regions = new ArrayList<>();
+    List modulators = new ArrayList<>();
 
     public DLSInstrument() {
         super(null, null, null, null);
@@ -62,6 +63,7 @@ public final class DLSInstrument extends ModelInstrument {
         return info;
     }
 
+    @Override
     public String getName() {
         return info.name;
     }
@@ -70,6 +72,7 @@ public final class DLSInstrument extends ModelInstrument {
         info.name = name;
     }
 
+    @Override
     public ModelPatch getPatch() {
         return new ModelPatch(bank, preset, druminstrument);
     }
@@ -86,6 +89,7 @@ public final class DLSInstrument extends ModelInstrument {
         }
     }
 
+    @Override
     public Object getData() {
         return null;
     }
@@ -98,6 +102,7 @@ public final class DLSInstrument extends ModelInstrument {
         return modulators;
     }
 
+    @Override
     public String toString() {
         if (druminstrument)
             return "Drumkit: " + info.name
@@ -362,17 +367,17 @@ public final class DLSInstrument extends ModelInstrument {
         return null;
     }
 
+    @Override
     public ModelPerformer[] getPerformers() {
-        List performers = new ArrayList();
+        List performers = new ArrayList<>();
 
-        Map modmap = new HashMap();
+        Map modmap = new HashMap<>();
         for (DLSModulator mod: getModulators()) {
             modmap.put(mod.getSource() + "x" + mod.getControl() + "=" +
                     mod.getDestination(), mod);
         }
 
-        Map insmodmap =
-                new HashMap();
+        Map insmodmap = new HashMap<>();
 
         for (DLSRegion zone: regions) {
             ModelPerformer performer = new ModelPerformer();
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
index 4cfa7d42a13..257777628b2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
index feb99823a98..b3456a31cbe 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.util.ArrayList;
@@ -39,7 +40,7 @@ import java.util.List;
 public final class DLSRegion {
 
     public static final int OPTION_SELFNONEXCLUSIVE = 0x0001;
-    List modulators = new ArrayList();
+    List modulators = new ArrayList<>();
     int keyfrom;
     int keyto;
     int velfrom;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
index 047783dfdab..61d0c2298a7 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
@@ -22,10 +22,12 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.io.InputStream;
 import java.util.Arrays;
+
 import javax.sound.midi.Soundbank;
 import javax.sound.midi.SoundbankResource;
 import javax.sound.sampled.AudioFormat;
@@ -60,6 +62,7 @@ public final class DLSSample extends SoundbankResource {
         return info;
     }
 
+    @Override
     public Object getData() {
         AudioFormat format = getFormat();
 
@@ -93,6 +96,7 @@ public final class DLSSample extends SoundbankResource {
         this.data = new ModelByteBuffer(data, offset, length);
     }
 
+    @Override
     public String getName() {
         return info.name;
     }
@@ -109,6 +113,7 @@ public final class DLSSample extends SoundbankResource {
         this.sampleoptions = sampleOptions;
     }
 
+    @Override
     public String toString() {
         return "Sample: " + info.name;
     }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
index 724815bd1bd..cd178d8af45 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
index 059f318f414..230b58fc7cd 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.util.ArrayList;
@@ -40,7 +41,7 @@ public final class DLSSampleOptions {
     short finetune;
     int attenuation;
     long options;
-    List loops = new ArrayList();
+    List loops = new ArrayList<>();
 
     public int getAttenuation() {
         return attenuation;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
index db509a96eef..e2fd9743f7e 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.io.File;
@@ -42,9 +43,9 @@ import javax.sound.midi.Patch;
 import javax.sound.midi.Soundbank;
 import javax.sound.midi.SoundbankResource;
 import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
 
 /**
  * A DLS Level 1 and Level 2 soundbank reader (from files/url/streams).
@@ -100,10 +101,12 @@ public final class DLSSoundbank implements Soundbank {
             return d;
         }
 
+        @Override
         public int hashCode() {
             return (int)i1;
         }
 
+        @Override
         public boolean equals(Object obj) {
             if (!(obj instanceof DLSID)) {
                 return false;
@@ -176,8 +179,8 @@ public final class DLSSoundbank implements Soundbank {
 
     private final DLSInfo info = new DLSInfo();
 
-    private final List instruments = new ArrayList();
-    private final List samples = new ArrayList();
+    private final List instruments = new ArrayList<>();
+    private final List samples = new ArrayList<>();
 
     private boolean largeFormat = false;
     private File sampleFile;
@@ -300,7 +303,7 @@ public final class DLSSoundbank implements Soundbank {
         DLSID uuid;
         long x;
         long y;
-        Stack stack = new Stack();
+        Stack stack = new Stack<>();
 
         while (riff.available() != 0) {
             int opcode = riff.readUnsignedShort();
@@ -482,7 +485,7 @@ public final class DLSSoundbank implements Soundbank {
                     }
                 }
                 if (chunk.getType().equals("lart")) {
-                    List modlist = new ArrayList();
+                    List modlist = new ArrayList<>();
                     while (chunk.hasNextChunk()) {
                         RIFFReader subchunk = chunk.nextChunk();
                         if (chunk.getFormat().equals("cdl ")) {
@@ -498,7 +501,7 @@ public final class DLSSoundbank implements Soundbank {
                 }
                 if (chunk.getType().equals("lar2")) {
                     // support for DLS level 2 ART
-                    List modlist = new ArrayList();
+                    List modlist = new ArrayList<>();
                     while (chunk.hasNextChunk()) {
                         RIFFReader subchunk = chunk.nextChunk();
                         if (chunk.getFormat().equals("cdl ")) {
@@ -582,7 +585,7 @@ public final class DLSSoundbank implements Soundbank {
         }
     }
 
-    private Map temp_rgnassign = new HashMap();
+    private Map temp_rgnassign = new HashMap<>();
 
     private boolean readRgnChunk(DLSRegion split, RIFFReader riff)
             throws IOException {
@@ -591,7 +594,7 @@ public final class DLSSoundbank implements Soundbank {
             String format = chunk.getFormat();
             if (format.equals("LIST")) {
                 if (chunk.getType().equals("lart")) {
-                    List modlist = new ArrayList();
+                    List modlist = new ArrayList<>();
                     while (chunk.hasNextChunk()) {
                         RIFFReader subchunk = chunk.nextChunk();
                         if (chunk.getFormat().equals("cdl ")) {
@@ -607,7 +610,7 @@ public final class DLSSoundbank implements Soundbank {
                 }
                 if (chunk.getType().equals("lar2")) {
                     // support for DLS level 2 ART
-                    List modlist = new ArrayList();
+                    List modlist = new ArrayList<>();
                     while (chunk.hasNextChunk()) {
                         RIFFReader subchunk = chunk.nextChunk();
                         if (chunk.getFormat().equals("cdl ")) {
@@ -902,7 +905,7 @@ public final class DLSSoundbank implements Soundbank {
 
         RIFFWriter wvpl = writer.writeList("wvpl");
         long off = wvpl.getFilePointer();
-        List offsettable = new ArrayList();
+        List offsettable = new ArrayList<>();
         for (DLSSample sample : samples) {
             offsettable.add(Long.valueOf(wvpl.getFilePointer() - off));
             writeSample(wvpl.writeList("wave"), sample);
@@ -1179,18 +1182,22 @@ public final class DLSSoundbank implements Soundbank {
         return info;
     }
 
+    @Override
     public String getName() {
         return info.name;
     }
 
+    @Override
     public String getVersion() {
         return major + "." + minor;
     }
 
+    @Override
     public String getVendor() {
         return info.engineers;
     }
 
+    @Override
     public String getDescription() {
         return info.comments;
     }
@@ -1207,6 +1214,7 @@ public final class DLSSoundbank implements Soundbank {
         info.comments = s;
     }
 
+    @Override
     public SoundbankResource[] getResources() {
         SoundbankResource[] resources = new SoundbankResource[samples.size()];
         int j = 0;
@@ -1215,6 +1223,7 @@ public final class DLSSoundbank implements Soundbank {
         return resources;
     }
 
+    @Override
     public DLSInstrument[] getInstruments() {
         DLSInstrument[] inslist_array =
                 instruments.toArray(new DLSInstrument[instruments.size()]);
@@ -1226,6 +1235,7 @@ public final class DLSSoundbank implements Soundbank {
         return samples.toArray(new DLSSample[samples.size()]);
     }
 
+    @Override
     public Instrument getInstrument(Patch patch) {
         int program = patch.getProgram();
         int bank = patch.getBank();
@@ -1256,9 +1266,9 @@ public final class DLSSoundbank implements Soundbank {
 
     public void removeResource(SoundbankResource resource) {
         if (resource instanceof DLSInstrument)
-            instruments.remove((DLSInstrument) resource);
+            instruments.remove(resource);
         if (resource instanceof DLSSample)
-            samples.remove((DLSSample) resource);
+            samples.remove(resource);
     }
 
     public void addInstrument(DLSInstrument resource) {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java
index 0bba5d49532..e366b3ad73f 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbankReader.java
@@ -29,6 +29,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+
 import javax.sound.midi.InvalidMidiDataException;
 import javax.sound.midi.Soundbank;
 import javax.sound.midi.spi.SoundbankReader;
@@ -41,6 +42,7 @@ import javax.sound.midi.spi.SoundbankReader;
  */
 public final class DLSSoundbankReader extends SoundbankReader {
 
+    @Override
     public Soundbank getSoundbank(URL url)
             throws InvalidMidiDataException, IOException {
         try {
@@ -52,6 +54,7 @@ public final class DLSSoundbankReader extends SoundbankReader {
         }
     }
 
+    @Override
     public Soundbank getSoundbank(InputStream stream)
             throws InvalidMidiDataException, IOException {
         try {
@@ -63,6 +66,7 @@ public final class DLSSoundbankReader extends SoundbankReader {
         }
     }
 
+    @Override
     public Soundbank getSoundbank(File file)
             throws InvalidMidiDataException, IOException {
         try {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java
index 95c0ff9f050..d9e969064a7 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DataPusher.java
@@ -27,7 +27,9 @@ package com.sun.media.sound;
 
 import java.util.Arrays;
 
-import javax.sound.sampled.*;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.SourceDataLine;
 
 /**
  * Class to write an AudioInputStream to a SourceDataLine.
@@ -125,7 +127,6 @@ public final class DataPusher implements Runnable {
         if (DEBUG || Printer.debug) Printer.debug("< DataPusher.start(loop="+loop+")");
     }
 
-
     public synchronized void stop() {
         if (DEBUG || Printer.debug) Printer.debug("> DataPusher.stop()");
         if (threadState == STATE_STOPPING
@@ -161,6 +162,7 @@ public final class DataPusher implements Runnable {
     /**
      * Write data to the source data line.
      */
+    @Override
     public void run() {
         byte[] buffer = null;
         boolean useStream = (ais != null);
@@ -242,5 +244,4 @@ public final class DataPusher implements Runnable {
         }
         if (DEBUG || Printer.debug)Printer.debug("DataPusher:end of thread");
     }
-
 } // class DataPusher
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java
index becf4981ba7..f65351e31c8 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDevice.java
@@ -29,35 +29,35 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Vector;
 
-import javax.sound.sampled.*;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.BooleanControl;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.Control;
+import javax.sound.sampled.DataLine;
+import javax.sound.sampled.FloatControl;
+import javax.sound.sampled.Line;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.TargetDataLine;
 
 // IDEA:
 // Use java.util.concurrent.Semaphore,
 // java.util.concurrent.locks.ReentrantLock and other new classes/methods
 // to improve this class's thread safety.
 
-
 /**
- * A Mixer which provides direct access to audio devices
+ * A Mixer which provides direct access to audio devices.
  *
  * @author Florian Bomers
  */
 final class DirectAudioDevice extends AbstractMixer {
 
-    // CONSTANTS
     private static final int CLIP_BUFFER_TIME = 1000; // in milliseconds
 
     private static final int DEFAULT_LINE_BUFFER_TIME = 500; // in milliseconds
 
-    // INSTANCE VARIABLES
-
-    /** number of opened lines */
-    private int deviceCountOpened = 0;
-
-    /** number of started lines */
-    private int deviceCountStarted = 0;
-
-    // CONSTRUCTOR
     DirectAudioDevice(DirectAudioDeviceProvider.DirectAudioDeviceInfo portMixerInfo) {
         // pass in Line.Info, mixer, controls
         super(portMixerInfo,              // Mixer.Info
@@ -168,6 +168,7 @@ final class DirectAudioDevice extends AbstractMixer {
 
     // ABSTRACT MIXER: ABSTRACT METHOD IMPLEMENTATIONS
 
+    @Override
     public Line getLine(Line.Info info) throws LineUnavailableException {
         Line.Info fullInfo = getLineInfo(info);
         if (fullInfo == null) {
@@ -216,7 +217,7 @@ final class DirectAudioDevice extends AbstractMixer {
         throw new IllegalArgumentException("Line unsupported: " + info);
     }
 
-
+    @Override
     public int getMaxLines(Line.Info info) {
         Line.Info fullInfo = getLineInfo(info);
 
@@ -233,26 +234,26 @@ final class DirectAudioDevice extends AbstractMixer {
         return 0;
     }
 
-
+    @Override
     protected void implOpen() throws LineUnavailableException {
         if (Printer.trace) Printer.trace("DirectAudioDevice: implOpen - void method");
     }
 
+    @Override
     protected void implClose() {
         if (Printer.trace) Printer.trace("DirectAudioDevice: implClose - void method");
     }
 
+    @Override
     protected void implStart() {
         if (Printer.trace) Printer.trace("DirectAudioDevice: implStart - void method");
     }
 
+    @Override
     protected void implStop() {
         if (Printer.trace) Printer.trace("DirectAudioDevice: implStop - void method");
     }
 
-
-    // IMPLEMENTATION HELPERS
-
     int getMixerIndex() {
         return ((DirectAudioDeviceProvider.DirectAudioDeviceInfo) getMixerInfo()).getIndex();
     }
@@ -319,12 +320,6 @@ final class DirectAudioDevice extends AbstractMixer {
         return null;
     }
 
-
-
-
-    // INNER CLASSES
-
-
     /**
      * Private inner class for the DataLine.Info objects
      * adds a little magic for the isFormatSupported so
@@ -367,7 +362,7 @@ final class DirectAudioDevice extends AbstractMixer {
     }
 
     /**
-     * Private inner class as base class for direct lines
+     * Private inner class as base class for direct lines.
      */
     private static class DirectDL extends AbstractDataLine implements EventDispatcher.LineMonitor {
         protected final int mixerIndex;
@@ -397,7 +392,6 @@ final class DirectAudioDevice extends AbstractMixer {
         // Guards all native calls.
         protected final Object lockNative = new Object();
 
-        // CONSTRUCTOR
         protected DirectDL(DataLine.Info info,
                            DirectAudioDevice mixer,
                            AudioFormat format,
@@ -414,11 +408,7 @@ final class DirectAudioDevice extends AbstractMixer {
 
         }
 
-
-        // ABSTRACT METHOD IMPLEMENTATIONS
-
-        // ABSTRACT LINE / DATALINE
-
+        @Override
         void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException {
             if (Printer.trace) Printer.trace(">> DirectDL: implOpen("+format+", "+bufferSize+" bytes)");
 
@@ -538,7 +528,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("<< DirectDL: implOpen() succeeded");
         }
 
-
+        @Override
         void implStart() {
             if (Printer.trace) Printer.trace(" >> DirectDL: implStart()");
 
@@ -570,6 +560,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("<< DirectDL: implStart() succeeded");
         }
 
+        @Override
         void implStop() {
             if (Printer.trace) Printer.trace(">> DirectDL: implStop()");
 
@@ -600,6 +591,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace(" << DirectDL: implStop() succeeded");
         }
 
+        @Override
         void implClose() {
             if (Printer.trace) Printer.trace(">> DirectDL: implClose()");
 
@@ -625,8 +617,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("<< DirectDL: implClose() succeeded");
         }
 
-        // METHOD OVERRIDES
-
+        @Override
         public int available() {
             if (id == 0) {
                 return 0;
@@ -638,7 +629,7 @@ final class DirectAudioDevice extends AbstractMixer {
             return a;
         }
 
-
+        @Override
         public void drain() {
             noService = true;
             // additional safeguard against draining forever
@@ -681,6 +672,7 @@ final class DirectAudioDevice extends AbstractMixer {
             noService = false;
         }
 
+        @Override
         public void flush() {
             if (id != 0) {
                 // first stop ongoing read/write method
@@ -699,6 +691,7 @@ final class DirectAudioDevice extends AbstractMixer {
         }
 
         // replacement for getFramePosition (see AbstractDataLine)
+        @Override
         public long getLongFramePosition() {
             long pos;
             synchronized (lockNative) {
@@ -713,7 +706,6 @@ final class DirectAudioDevice extends AbstractMixer {
             return (pos / getFormat().getFrameSize());
         }
 
-
         /*
          * write() belongs into SourceDataLine and Clip,
          * so define it here and make it accessible by
@@ -786,6 +778,7 @@ final class DirectAudioDevice extends AbstractMixer {
         }
 
         // called from event dispatcher for lines that need servicing
+        @Override
         public void checkLine() {
             synchronized (lockNative) {
                 if (monitoring
@@ -826,7 +819,6 @@ final class DirectAudioDevice extends AbstractMixer {
             }
         }
 
-
         /////////////////// CONTROLS /////////////////////////////
 
         protected final class Gain extends FloatControl {
@@ -844,6 +836,7 @@ final class DirectAudioDevice extends AbstractMixer {
                       "dB", "Minimum", "", "Maximum");
             }
 
+            @Override
             public void setValue(float newValue) {
                 // adjust value within range ?? spec says IllegalArgumentException
                 //newValue = Math.min(newValue, getMaximum());
@@ -861,13 +854,13 @@ final class DirectAudioDevice extends AbstractMixer {
             }
         } // class Gain
 
-
         private final class Mute extends BooleanControl {
 
             private Mute() {
                 super(BooleanControl.Type.MUTE, false, "True", "False");
             }
 
+            @Override
             public void setValue(boolean newValue) {
                 super.setValue(newValue);
                 calcVolume();
@@ -881,6 +874,7 @@ final class DirectAudioDevice extends AbstractMixer {
                       "", "Left", "Center", "Right");
             }
 
+            @Override
             public void setValue(float newValue) {
                 setValueImpl(newValue);
                 panControl.setValueImpl(newValue);
@@ -900,6 +894,7 @@ final class DirectAudioDevice extends AbstractMixer {
                       "", "Left", "Center", "Right");
             }
 
+            @Override
             public void setValue(float newValue) {
                 setValueImpl(newValue);
                 balanceControl.setValueImpl(newValue);
@@ -909,19 +904,14 @@ final class DirectAudioDevice extends AbstractMixer {
                 super.setValue(newValue);
             }
         } // class Pan
-
-
-
     } // class DirectDL
 
-
     /**
-     * Private inner class representing a SourceDataLine
+     * Private inner class representing a SourceDataLine.
      */
     private static final class DirectSDL extends DirectDL
             implements SourceDataLine {
 
-        // CONSTRUCTOR
         private DirectSDL(DataLine.Info info,
                           AudioFormat format,
                           int bufferSize,
@@ -933,12 +923,11 @@ final class DirectAudioDevice extends AbstractMixer {
     }
 
     /**
-     * Private inner class representing a TargetDataLine
+     * Private inner class representing a TargetDataLine.
      */
     private static final class DirectTDL extends DirectDL
             implements TargetDataLine {
 
-        // CONSTRUCTOR
         private DirectTDL(DataLine.Info info,
                           AudioFormat format,
                           int bufferSize,
@@ -947,8 +936,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("DirectTDL CONSTRUCTOR: completed");
         }
 
-        // METHOD OVERRIDES
-
+        @Override
         public int read(byte[] b, int off, int len) {
             flushing = false;
             if (len == 0) {
@@ -1030,7 +1018,6 @@ final class DirectAudioDevice extends AbstractMixer {
         // auto closing clip support
         private boolean autoclosing = false;
 
-        // CONSTRUCTOR
         private DirectClip(DataLine.Info info,
                            AudioFormat format,
                            int bufferSize,
@@ -1041,6 +1028,7 @@ final class DirectAudioDevice extends AbstractMixer {
 
         // CLIP METHODS
 
+        @Override
         public void open(AudioFormat format, byte[] data, int offset, int bufferSize)
             throws LineUnavailableException {
 
@@ -1111,7 +1099,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("< DirectClip.open completed");
         }
 
-
+        @Override
         public void open(AudioInputStream stream) throws LineUnavailableException, IOException {
 
             // $$fb part of fix for 4679187: Clip.open() throws unexpected Exceptions
@@ -1178,17 +1166,17 @@ final class DirectAudioDevice extends AbstractMixer {
             } // synchronized
         }
 
-
+        @Override
         public int getFrameLength() {
             return m_lengthInFrames;
         }
 
-
+        @Override
         public long getMicrosecondLength() {
             return Toolkit.frames2micros(getFormat(), getFrameLength());
         }
 
-
+        @Override
         public void setFramePosition(int frames) {
             if (Printer.trace) Printer.trace("> DirectClip: setFramePosition: " + frames);
 
@@ -1229,6 +1217,7 @@ final class DirectAudioDevice extends AbstractMixer {
         }
 
         // replacement for getFramePosition (see AbstractDataLine)
+        @Override
         public long getLongFramePosition() {
             /* $$fb
              * this would be intuitive, but the definition of getFramePosition
@@ -1243,7 +1232,7 @@ final class DirectAudioDevice extends AbstractMixer {
             return super.getLongFramePosition();
         }
 
-
+        @Override
         public synchronized void setMicrosecondPosition(long microseconds) {
             if (Printer.trace) Printer.trace("> DirectClip: setMicrosecondPosition: " + microseconds);
 
@@ -1253,6 +1242,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("< DirectClip: setMicrosecondPosition succeeded");
         }
 
+        @Override
         public void setLoopPoints(int start, int end) {
             if (Printer.trace) Printer.trace("> DirectClip: setLoopPoints: start: " + start + " end: " + end);
 
@@ -1283,7 +1273,7 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("< DirectClip: setLoopPoints completed");
         }
 
-
+        @Override
         public void loop(int count) {
             // note: when count reaches 0, it means that the entire clip
             // will be played, i.e. it will play past the loop end point
@@ -1291,10 +1281,7 @@ final class DirectAudioDevice extends AbstractMixer {
             start();
         }
 
-        // ABSTRACT METHOD IMPLEMENTATIONS
-
-        // ABSTRACT LINE
-
+        @Override
         void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException {
             // only if audioData wasn't set in a calling open(format, byte[], frameSize)
             // this call is allowed.
@@ -1304,6 +1291,7 @@ final class DirectAudioDevice extends AbstractMixer {
             super.implOpen(format, bufferSize);
         }
 
+        @Override
         void implClose() {
             if (Printer.trace) Printer.trace(">> DirectClip: implClose()");
 
@@ -1333,13 +1321,14 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("<< DirectClip: implClose() succeeded");
         }
 
-
+        @Override
         void implStart() {
             if (Printer.trace) Printer.trace("> DirectClip: implStart()");
             super.implStart();
             if (Printer.trace) Printer.trace("< DirectClip: implStart() succeeded");
         }
 
+        @Override
         void implStop() {
             if (Printer.trace) Printer.trace(">> DirectClip: implStop()");
 
@@ -1351,8 +1340,8 @@ final class DirectAudioDevice extends AbstractMixer {
             if (Printer.trace) Printer.trace("<< DirectClip: implStop() succeeded");
         }
 
-
         // main playback loop
+        @Override
         public void run() {
             if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId());
             while (thread != null) {
@@ -1418,10 +1407,12 @@ final class DirectAudioDevice extends AbstractMixer {
            MixerClip. They should be moved to a base class, together
            with the instance variable 'autoclosing'. */
 
+        @Override
         public boolean isAutoClosing() {
             return autoclosing;
         }
 
+        @Override
         public void setAutoClosing(boolean value) {
             if (value != autoclosing) {
                 if (isOpen()) {
@@ -1435,6 +1426,7 @@ final class DirectAudioDevice extends AbstractMixer {
             }
         }
 
+        @Override
         protected boolean requiresServicing() {
             // no need for servicing for Clips
             return false;
@@ -1488,5 +1480,4 @@ final class DirectAudioDevice extends AbstractMixer {
     private static native boolean nRequiresServicing(long id, boolean isSource);
     // called in irregular intervals
     private static native void nService(long id, boolean isSource);
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java
index 274571917ea..15d4fc1a93f 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DirectAudioDeviceProvider.java
@@ -28,7 +28,6 @@ package com.sun.media.sound;
 import javax.sound.sampled.Mixer;
 import javax.sound.sampled.spi.MixerProvider;
 
-
 /**
  * DirectAudioDevice provider.
  *
@@ -36,8 +35,6 @@ import javax.sound.sampled.spi.MixerProvider;
  */
 public final class DirectAudioDeviceProvider extends MixerProvider {
 
-    // STATIC VARIABLES
-
     /**
      * Set of info objects for all port input devices on the system.
      */
@@ -48,18 +45,11 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
      */
     private static DirectAudioDevice[] devices;
 
-
-    // STATIC
-
     static {
         // initialize
         Platform.initialize();
     }
 
-
-    // CONSTRUCTOR
-
-
     /**
      * Required public no-arg constructor.
      */
@@ -92,6 +82,7 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
         }
     }
 
+    @Override
     public Mixer.Info[] getMixerInfo() {
         synchronized (DirectAudioDeviceProvider.class) {
             Mixer.Info[] localArray = new Mixer.Info[infos.length];
@@ -100,7 +91,7 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
         }
     }
 
-
+    @Override
     public Mixer getMixer(Mixer.Info info) {
         synchronized (DirectAudioDeviceProvider.class) {
             // if the default device is asked, we provide the mixer
@@ -125,7 +116,6 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
                 String.format("Mixer %s not supported by this provider", info));
     }
 
-
     private static Mixer getDevice(DirectAudioDeviceInfo info) {
         int index = info.getIndex();
         if (devices[index] == null) {
@@ -134,9 +124,6 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
         return devices[index];
     }
 
-    // INNER CLASSES
-
-
     /**
      * Info class for DirectAudioDevices.  Adds an index value and a string for
      * making native references to a particular device.
@@ -171,7 +158,6 @@ public final class DirectAudioDeviceProvider extends MixerProvider {
         }
     } // class DirectAudioDeviceInfo
 
-    // NATIVE METHODS
     private static native int nGetNumDevices();
     // index: [0..nGetNumDevices()-1]
     private static native DirectAudioDeviceInfo nNewDirectAudioDeviceInfo(int deviceIndex);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java
index 22638076fcd..73a938babab 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EmergencySoundbank.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.util.Random;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java
index 49709891bd0..3880682f3f2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/EventDispatcher.java
@@ -35,8 +35,6 @@ import javax.sound.midi.ShortMessage;
 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineListener;
 
-
-
 /**
  * EventDispatcher.  Used by various classes in the Java Sound implementation
  * to send events.
@@ -49,39 +47,35 @@ final class EventDispatcher implements Runnable {
 
     /**
      * time of inactivity until the auto closing clips
-     * are closed
+     * are closed.
      */
     private static final int AUTO_CLOSE_TIME = 5000;
 
-
     /**
-     * List of events
+     * List of events.
      */
     private final ArrayList eventQueue = new ArrayList<>();
 
-
     /**
-     * Thread object for this EventDispatcher instance
+     * Thread object for this EventDispatcher instance.
      */
     private Thread thread = null;
 
-
     /*
      * support for auto-closing Clips
      */
-    private final ArrayList autoClosingClips = new ArrayList();
+    private final ArrayList autoClosingClips = new ArrayList<>();
 
     /*
      * support for monitoring data lines
      */
-    private final ArrayList lineMonitors = new ArrayList();
+    private final ArrayList lineMonitors = new ArrayList<>();
 
     /**
      * Approximate interval between calls to LineMonitor.checkLine
      */
     static final int LINE_MONITOR_TIME = 400;
 
-
     /**
      * This start() method starts an event thread if one is not already active.
      */
@@ -96,7 +90,6 @@ final class EventDispatcher implements Runnable {
         }
     }
 
-
     /**
      * Invoked when there is at least one event in the queue.
      * Implement this as a callback to process one event.
@@ -153,7 +146,6 @@ final class EventDispatcher implements Runnable {
         Printer.err("Unknown event type: " + eventInfo.getEvent());
     }
 
-
     /**
      * Wait until there is something in the event queue to process.  Then
      * dispatch the event to the listeners.The entire method does not
@@ -202,7 +194,6 @@ final class EventDispatcher implements Runnable {
         }
     }
 
-
     /**
      * Queue the given event in the event queue.
      */
@@ -211,10 +202,10 @@ final class EventDispatcher implements Runnable {
         notifyAll();
     }
 
-
     /**
      * A loop to dispatch events.
      */
+    @Override
     public void run() {
 
         while (true) {
@@ -226,7 +217,6 @@ final class EventDispatcher implements Runnable {
         }
     }
 
-
     /**
      * Send audio and MIDI events.
      */
@@ -243,7 +233,6 @@ final class EventDispatcher implements Runnable {
         postEvent(eventInfo);
     }
 
-
     /*
      * go through the list of registered auto-closing
      * Clip instances and close them, if appropriate
@@ -291,7 +280,7 @@ final class EventDispatcher implements Runnable {
     }
 
     /**
-     * called from auto-closing clips when one of their open() method is called
+     * called from auto-closing clips when one of their open() method is called.
      */
     void autoClosingClipOpened(AutoClosingClip clip) {
         if (Printer.debug)Printer.debug("> EventDispatcher.autoClosingClipOpened ");
@@ -316,7 +305,7 @@ final class EventDispatcher implements Runnable {
     }
 
     /**
-     * called from auto-closing clips when their closed() method is called
+     * called from auto-closing clips when their closed() method is called.
      */
     void autoClosingClipClosed(AutoClosingClip clip) {
         // nothing to do -- is removed from arraylist above
@@ -340,9 +329,8 @@ final class EventDispatcher implements Runnable {
         if (Printer.debug)Printer.debug("< EventDispatcher.monitorLines("+lineMonitors.size()+" monitors)");
     }
 
-
     /**
-     * Add this LineMonitor instance to the list of monitors
+     * Add this LineMonitor instance to the list of monitors.
      */
     void addLineMonitor(LineMonitor lm) {
         if (Printer.trace)Printer.trace("> EventDispatcher.addLineMonitor("+lm+")");
@@ -362,7 +350,7 @@ final class EventDispatcher implements Runnable {
     }
 
     /**
-     * Remove this LineMonitor instance from the list of monitors
+     * Remove this LineMonitor instance from the list of monitors.
      */
     void removeLineMonitor(LineMonitor lm) {
         if (Printer.trace)Printer.trace("> EventDispatcher.removeLineMonitor("+lm+")");
@@ -377,8 +365,6 @@ final class EventDispatcher implements Runnable {
         if (Printer.debug)Printer.debug("< EventDispatcher.removeLineMonitor finished -- now ("+lineMonitors.size()+" monitors)");
     }
 
-    // /////////////////////////////////// INNER CLASSES ////////////////////////////////////////// //
-
     /**
      * Container for an event and a set of listeners to deliver it to.
      */
@@ -413,7 +399,7 @@ final class EventDispatcher implements Runnable {
 
 
     /**
-     * Container for a clip with its expiration time
+     * Container for a clip with its expiration time.
      */
     private class ClipInfo {
 
@@ -421,7 +407,7 @@ final class EventDispatcher implements Runnable {
         private final long expiration;
 
         /**
-         * Create a new instance of this clip Info class
+         * Create a new instance of this clip Info class.
          */
         ClipInfo(AutoClosingClip clip) {
             this.clip = clip;
@@ -440,13 +426,13 @@ final class EventDispatcher implements Runnable {
 
     /**
      * Interface that a class that wants to get regular
-     * line monitor events implements
+     * line monitor events implements.
      */
     interface LineMonitor {
         /**
-         * Called by event dispatcher in regular intervals
+         * Called by event dispatcher in regular intervals.
          */
-        public void checkLine();
+        void checkLine();
     }
 
 } // class EventDispatcher
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java
index 8b1436736c0..8952cf7f60a 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FFT.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
@@ -588,7 +589,6 @@ public final class FFT {
             i += jmax << 1;
 
         }
-
     }
 
     // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/-
@@ -682,7 +682,6 @@ public final class FFT {
             i += jmax << 1;
 
         }
-
     }
 
     private void bitreversal(double[] data) {
@@ -743,6 +742,5 @@ public final class FFT {
             data[n] = data[m];
             data[m] = tempi;
         }
-
     }
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java
index 54307f238a4..77fea07e31e 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastShortMessage.java
@@ -25,10 +25,11 @@
 
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.ShortMessage;
 
 /**
- * an optimized ShortMessage that does not need an array
+ * an optimized ShortMessage that does not need an array.
  *
  * @author Florian Bomers
  */
@@ -51,6 +52,7 @@ final class FastShortMessage extends ShortMessage {
         return packedMsg;
     }
 
+    @Override
     public byte[] getMessage() {
         int length = 0;
         try {
@@ -73,6 +75,7 @@ final class FastShortMessage extends ShortMessage {
         return returnedArray;
     }
 
+    @Override
     public int getLength() {
         try {
             return getDataLength(packedMsg & 0xFF) + 1;
@@ -82,6 +85,7 @@ final class FastShortMessage extends ShortMessage {
         return 0;
     }
 
+    @Override
     public void setMessage(int status) throws InvalidMidiDataException {
         // check for valid values
         int dataLength = getDataLength(status); // can throw InvalidMidiDataException
@@ -91,35 +95,39 @@ final class FastShortMessage extends ShortMessage {
         packedMsg = (packedMsg & 0xFFFF00) | (status & 0xFF);
     }
 
-
+    @Override
     public void setMessage(int status, int data1, int data2) throws InvalidMidiDataException {
         getDataLength(status); // can throw InvalidMidiDataException
         packedMsg = (status & 0xFF) | ((data1 & 0xFF) << 8) | ((data2 & 0xFF) << 16);
     }
 
-
+    @Override
     public void setMessage(int command, int channel, int data1, int data2) throws InvalidMidiDataException {
         getDataLength(command); // can throw InvalidMidiDataException
         packedMsg = (command & 0xF0) | (channel & 0x0F) | ((data1 & 0xFF) << 8) | ((data2 & 0xFF) << 16);
     }
 
-
+    @Override
     public int getChannel() {
         return packedMsg & 0x0F;
     }
 
+    @Override
     public int getCommand() {
         return packedMsg & 0xF0;
     }
 
+    @Override
     public int getData1() {
         return (packedMsg & 0xFF00) >> 8;
     }
 
+    @Override
     public int getData2() {
         return (packedMsg & 0xFF0000) >> 16;
     }
 
+    @Override
     public int getStatus() {
         return packedMsg & 0xFF;
     }
@@ -129,6 +137,7 @@ final class FastShortMessage extends ShortMessage {
      * as this object.
      * @return a clone of this instance.
      */
+    @Override
     public Object clone() {
         try {
             return new FastShortMessage(packedMsg);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java
index 8b847eb2f2b..f137e81e2a0 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/FastSysexMessage.java
@@ -25,10 +25,11 @@
 
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.SysexMessage;
 
 /**
- * optimized FastSysexMessage that doesn't copy the array upon instantiation
+ * optimized FastSysexMessage that doesn't copy the array upon instantiation.
  *
  * @author Florian Bomers
  */
@@ -51,6 +52,7 @@ final class FastSysexMessage extends SysexMessage {
 
     // overwrite this method so that the original data array,
     // which is shared among all transmitters, cannot be modified
+    @Override
     public void setMessage(byte[] data, int length) throws InvalidMidiDataException {
         if ((data.length == 0) || (((data[0] & 0xFF) != 0xF0) && ((data[0] & 0xFF) != 0xF7))) {
             super.setMessage(data, data.length); // will throw Exception
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java
index ed43640f287..b61f27bcaa2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidDataException.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 import java.io.IOException;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java
index 4fcc46c4131..7aa76bc9e26 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/InvalidFormatException.java
@@ -22,6 +22,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
 /**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java
index a5f024a2592..db1a769fbd2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JARSoundbankReader.java
@@ -69,11 +69,12 @@ public final class JARSoundbankReader extends SoundbankReader {
         return ok;
     }
 
+    @Override
     public Soundbank getSoundbank(URL url)
             throws InvalidMidiDataException, IOException {
         if (!isZIP(url))
             return null;
-        ArrayList soundbanks = new ArrayList();
+        ArrayList soundbanks = new ArrayList<>();
         URLClassLoader ucl = URLClassLoader.newInstance(new URL[]{url});
         InputStream stream = ucl.getResourceAsStream(
                 "META-INF/services/javax.sound.midi.Soundbank");
@@ -114,12 +115,14 @@ public final class JARSoundbankReader extends SoundbankReader {
         return sbk;
     }
 
+    @Override
     public Soundbank getSoundbank(InputStream stream)
             throws InvalidMidiDataException, IOException {
         Objects.requireNonNull(stream);
         return null;
     }
 
+    @Override
     public Soundbank getSoundbank(File file)
             throws InvalidMidiDataException, IOException {
         return getSoundbank(file.toURI().toURL());
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java
index be36779345a..c70c9800cca 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JDK13Services.java
@@ -136,7 +136,6 @@ public final class JDK13Services {
         return value;
     }
 
-
     /** Obtain the instance name part of a default provider property.
         @param typeClass The type of the default provider property. This
         should be one of Receiver.class, Transmitter.class, Sequencer.class,
@@ -158,7 +157,6 @@ public final class JDK13Services {
         return value;
     }
 
-
     /** Obtain the value of a default provider property.
         @param typeClass The type of the default provider property. This
         should be one of Receiver.class, Transmitter.class, Sequencer.class,
@@ -190,7 +188,6 @@ public final class JDK13Services {
         return value;
     }
 
-
     /** Obtain a properties bundle containing property values from the
         properties file. If the properties file could not be loaded,
         the properties bundle is empty.
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java
index d59118889c2..e1de7a4587d 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JSSecurityManager.java
@@ -26,19 +26,17 @@
 package com.sun.media.sound;
 
 import java.io.BufferedInputStream;
-import java.io.InputStream;
 import java.io.File;
 import java.io.FileInputStream;
-
+import java.io.InputStream;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 import java.util.ServiceLoader;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
 import javax.sound.sampled.AudioPermission;
 
 /** Managing security in the Java Sound implementation.
@@ -64,7 +62,6 @@ final class JSSecurityManager {
         return (System.getSecurityManager() != null);
     }
 
-
     static void checkRecordPermission() throws SecurityException {
         if(Printer.trace) Printer.trace("JSSecurityManager.checkRecordPermission()");
         SecurityManager sm = System.getSecurityManager();
@@ -90,6 +87,7 @@ final class JSSecurityManager {
             try {
                 // invoke the privileged action using 1.2 security
                 PrivilegedAction action = new PrivilegedAction() {
+                        @Override
                         public Void run() {
                             loadPropertiesImpl(properties, filename);
                             return null;
@@ -108,7 +106,6 @@ final class JSSecurityManager {
         }
     }
 
-
     private static void loadPropertiesImpl(Properties properties,
                                            String filename) {
         if(Printer.trace)Printer.trace(">> JSSecurityManager: loadPropertiesImpl()");
@@ -176,6 +173,7 @@ final class JSSecurityManager {
         // the iterator's hasNext() method looks through classpath for
         // the provider class names, so it requires read permissions
         PrivilegedAction hasNextAction = new PrivilegedAction() {
+            @Override
             public Boolean run() {
                 return ps.hasNext();
             }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java
index ca9ac9c9122..28f26796169 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/JavaSoundAudioClip.java
@@ -25,30 +25,29 @@
 
 package com.sun.media.sound;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.applet.AudioClip;
 import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
-import java.applet.AudioClip;
+import java.io.IOException;
+import java.io.InputStream;
 
-import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.Clip;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.DataLine;
-import javax.sound.sampled.SourceDataLine;
-import javax.sound.sampled.LineEvent;
-import javax.sound.sampled.LineListener;
-import javax.sound.sampled.UnsupportedAudioFileException;
-
-import javax.sound.midi.MidiSystem;
-import javax.sound.midi.MidiFileFormat;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MetaEventListener;
 import javax.sound.midi.MetaMessage;
+import javax.sound.midi.MidiFileFormat;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
 import javax.sound.midi.Sequence;
 import javax.sound.midi.Sequencer;
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.MetaEventListener;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.DataLine;
+import javax.sound.sampled.LineEvent;
+import javax.sound.sampled.LineListener;
+import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.UnsupportedAudioFileException;
 
 /**
  * Java Sound audio clip;
@@ -56,7 +55,6 @@ import javax.sound.midi.MetaEventListener;
  * @author Arthur van Hoff, Kara Kytle, Jan Borgersen
  * @author Florian Bomers
  */
-
 public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, LineListener {
 
     private static final boolean DEBUG = false;
@@ -126,12 +124,12 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         }
     }
 
-
+    @Override
     public synchronized void play() {
         startImpl(false);
     }
 
-
+    @Override
     public synchronized void loop() {
         startImpl(true);
     }
@@ -205,6 +203,7 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         }
     }
 
+    @Override
     public synchronized void stop() {
 
         if (DEBUG || Printer.debug)Printer.debug("JavaSoundAudioClip->stop()");
@@ -248,13 +247,15 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
 
     // Event handlers (for debugging)
 
+    @Override
     public synchronized void update(LineEvent event) {
         if (DEBUG || Printer.debug) Printer.debug("line event received: "+event);
     }
 
     // handle MIDI track end meta events for looping
 
-    public synchronized void meta( MetaMessage message ) {
+    @Override
+    public synchronized void meta(MetaMessage message) {
 
         if (DEBUG || Printer.debug)Printer.debug("META EVENT RECEIVED!!!!! ");
 
@@ -269,12 +270,12 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         }
     }
 
-
+    @Override
     public String toString() {
         return getClass().toString();
     }
 
-
+    @Override
     protected void finalize() {
 
         if (clip != null) {
@@ -326,8 +327,6 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         return true;
     }
 
-
-
     private void readStream(AudioInputStream as, long byteLen) throws IOException {
         // arrays "only" max. 2GB
         int intLen;
@@ -371,7 +370,6 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         loadedAudioByteLength = totalBytesRead;
     }
 
-
     // METHODS FOR CREATING THE DEVICE
 
     private boolean createClip() {
@@ -464,7 +462,6 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         return true;
     }
 
-
     /*
      * private inner class representing a ByteArrayOutputStream
      * which allows retrieval of the internal array
@@ -479,5 +476,4 @@ public final class JavaSoundAudioClip implements AudioClip, MetaEventListener, L
         }
 
     } // class DirectBAOS
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java
index fb200208c86..1386e0df7b9 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceReceiverEnvelope.java
@@ -22,10 +22,13 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
-
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.Receiver;
 
 /**
  * Helper class which allows to convert {@code Receiver}
@@ -55,15 +58,18 @@ public final class MidiDeviceReceiverEnvelope implements MidiDeviceReceiver {
     }
 
     // Receiver implementation
+    @Override
     public void close() {
         receiver.close();
     }
 
+    @Override
     public void send(MidiMessage message, long timeStamp) {
         receiver.send(message, timeStamp);
     }
 
     // MidiDeviceReceiver implementation
+    @Override
     public MidiDevice getMidiDevice() {
         return device;
     }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java
index eca630a6c8c..8cd063c8f09 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiDeviceTransmitterEnvelope.java
@@ -22,10 +22,13 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
-
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceTransmitter;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
 
 /**
  * Helper class which allows to convert {@code Transmitter}
@@ -55,20 +58,23 @@ public final class MidiDeviceTransmitterEnvelope implements MidiDeviceTransmitte
     }
 
     // Transmitter implementation
+    @Override
     public void setReceiver(Receiver receiver) {
         transmitter.setReceiver(receiver);
     }
 
+    @Override
     public Receiver getReceiver() {
         return transmitter.getReceiver();
     }
 
+    @Override
     public void close() {
         transmitter.close();
     }
 
-
     // MidiDeviceReceiver implementation
+    @Override
     public MidiDevice getMidiDevice() {
         return device;
     }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java
index be8480dcd57..e12264382d5 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDevice.java
@@ -25,9 +25,8 @@
 
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
-
-
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Transmitter;
 
 /**
  * MidiInDevice class representing functionality of MidiIn devices.
@@ -40,18 +39,14 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
 
     private volatile Thread midiInThread;
 
-    // CONSTRUCTOR
-
     MidiInDevice(AbstractMidiDeviceProvider.Info info) {
         super(info);
         if(Printer.trace) Printer.trace("MidiInDevice CONSTRUCTOR");
     }
 
-
-    // IMPLEMENTATION OF ABSTRACT MIDI DEVICE METHODS
-
     // $$kk: 06.24.99: i have this both opening and starting the midi in device.
     // may want to separate these??
+    @Override
     protected synchronized void implOpen() throws MidiUnavailableException {
         if (Printer.trace) Printer.trace("> MidiInDevice: implOpen()");
 
@@ -75,9 +70,9 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         if (Printer.trace) Printer.trace("< MidiInDevice: implOpen() completed");
     }
 
-
     // $$kk: 06.24.99: i have this both stopping and closing the midi in device.
     // may want to separate these??
+    @Override
     protected synchronized void implClose() {
         if (Printer.trace) Printer.trace("> MidiInDevice: implClose()");
         long oldId = id;
@@ -98,7 +93,7 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         if (Printer.trace) Printer.trace("< MidiInDevice: implClose() completed");
     }
 
-
+    @Override
     public long getMicrosecondPosition() {
         long timestamp = -1;
         if (isOpen()) {
@@ -107,22 +102,21 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         return timestamp;
     }
 
-
     // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS
 
-
+    @Override
     protected boolean hasTransmitters() {
         return true;
     }
 
-
+    @Override
     protected Transmitter createTransmitter() {
         return new MidiInTransmitter();
     }
 
     /**
       * An own class to distinguish the class name from
-      * the transmitter of other devices
+      * the transmitter of other devices.
       */
     private final class MidiInTransmitter extends BasicTransmitter {
         private MidiInTransmitter() {
@@ -130,8 +124,7 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         }
     }
 
-    // RUNNABLE METHOD
-
+    @Override
     public void run() {
         // while the device is started, keep trying to get messages.
         // this thread returns from native code whenever stop() or close() is called
@@ -149,9 +142,6 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         midiInThread = null;
     }
 
-
-    // CALLBACKS FROM NATIVE
-
     /**
      * Callback from native code when a short MIDI event is received from hardware.
      * @param packedMsg: status | data1 << 8 | data2 << 8
@@ -179,8 +169,6 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
         getTransmitterList().sendMessage(data, timeStamp);
     }
 
-    // NATIVE METHODS
-
     private native long nOpen(int index) throws MidiUnavailableException;
     private native void nClose(long id);
 
@@ -190,6 +178,4 @@ final class MidiInDevice extends AbstractMidiDevice implements Runnable {
 
     // go into native code and get messages. May be blocking
     private native void nGetMessages(long id);
-
-
 }
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java
index 5044dfeaa17..cdadfd5df06 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiInDeviceProvider.java
@@ -27,7 +27,6 @@ package com.sun.media.sound;
 
 import javax.sound.midi.MidiDevice;
 
-
 /**
  * MIDI input device provider.
  *
@@ -44,16 +43,12 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
 
     private static final boolean enabled;
 
-    // STATIC
-
     static {
         // initialize
         Platform.initialize();
         enabled = Platform.isMidiIOEnabled();
     }
 
-    // CONSTRUCTOR
-
     /**
      * Required public no-arg constructor.
      */
@@ -63,6 +58,7 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
 
     // implementation of abstract methods in AbstractMidiDeviceProvider
 
+    @Override
     AbstractMidiDeviceProvider.Info createInfo(int index) {
         if (!enabled) {
             return null;
@@ -70,6 +66,7 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
         return new MidiInDeviceInfo(index, MidiInDeviceProvider.class);
     }
 
+    @Override
     MidiDevice createDevice(AbstractMidiDeviceProvider.Info info) {
         if (enabled && (info instanceof MidiInDeviceInfo)) {
             return new MidiInDevice(info);
@@ -77,6 +74,7 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
         return null;
     }
 
+    @Override
     int getNumDevices() {
         if (!enabled) {
             if (Printer.debug)Printer.debug("MidiInDevice not enabled, returning 0 devices");
@@ -87,14 +85,15 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
         return numDevices;
     }
 
+    @Override
     MidiDevice[] getDeviceCache() { return devices; }
+    @Override
     void setDeviceCache(MidiDevice[] devices) { MidiInDeviceProvider.devices = devices; }
+    @Override
     Info[] getInfoCache() { return infos; }
+    @Override
     void setInfoCache(Info[] infos) { MidiInDeviceProvider.infos = infos; }
 
-
-    // INNER CLASSES
-
     /**
      * Info class for MidiInDevices.  Adds the
      * provider's Class to keep the provider class from being
@@ -115,9 +114,6 @@ public final class MidiInDeviceProvider extends AbstractMidiDeviceProvider {
 
     } // class MidiInDeviceInfo
 
-
-    // NATIVE METHODS
-
     private static native int nGetNumDevices();
     private static native String nGetName(int index);
     private static native String nGetVendor(int index);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java
index 4559c9b59e9..991c4324a52 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDevice.java
@@ -25,9 +25,10 @@
 
 package com.sun.media.sound;
 
-import javax.sound.midi.*;
-
-
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.ShortMessage;
 
 /**
  * MidiOutDevice class representing functionality of MidiOut devices.
@@ -38,16 +39,12 @@ import javax.sound.midi.*;
  */
 final class MidiOutDevice extends AbstractMidiDevice {
 
-    // CONSTRUCTOR
-
     MidiOutDevice(AbstractMidiDeviceProvider.Info info) {
                 super(info);
                 if(Printer.trace) Printer.trace("MidiOutDevice CONSTRUCTOR");
     }
 
-
-    // IMPLEMENTATION OF ABSTRACT MIDI DEVICE METHODS
-
+    @Override
     protected synchronized void implOpen() throws MidiUnavailableException {
         if (Printer.trace) Printer.trace("> MidiOutDevice: implOpen()");
         int index = ((AbstractMidiDeviceProvider.Info)getDeviceInfo()).getIndex();
@@ -58,7 +55,7 @@ final class MidiOutDevice extends AbstractMidiDevice {
         if (Printer.trace) Printer.trace("< MidiOutDevice: implOpen(): completed.");
     }
 
-
+    @Override
     protected synchronized void implClose() {
         if (Printer.trace) Printer.trace("> MidiOutDevice: implClose()");
         // prevent further action
@@ -72,7 +69,7 @@ final class MidiOutDevice extends AbstractMidiDevice {
         if (Printer.trace) Printer.trace("< MidiOutDevice: implClose(): completed");
     }
 
-
+    @Override
     public long getMicrosecondPosition() {
         long timestamp = -1;
         if (isOpen()) {
@@ -81,28 +78,23 @@ final class MidiOutDevice extends AbstractMidiDevice {
         return timestamp;
     }
 
-
-
-    // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS
-
     /** Returns if this device supports Receivers.
         This implementation always returns true.
         @return true, if the device supports Receivers, false otherwise.
     */
+    @Override
     protected boolean hasReceivers() {
         return true;
     }
 
-
+    @Override
     protected Receiver createReceiver() {
         return new MidiOutReceiver();
     }
 
-
-    // INNER CLASSES
-
     final class MidiOutReceiver extends AbstractReceiver {
 
+        @Override
         void implSend(final MidiMessage message, final long timeStamp) {
             final int length = message.getLength();
             final int status = message.getStatus();
@@ -159,13 +151,8 @@ final class MidiOutDevice extends AbstractMidiDevice {
                 nSendShortMessage(id, packedMsg, timeStamp);
             }
         }
-
-
     } // class MidiOutReceiver
 
-
-    // NATIVE METHODS
-
     private native long nOpen(int index) throws MidiUnavailableException;
     private native void nClose(long id);
 
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java
index dd0894aaf02..51ddc9d0e20 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiOutDeviceProvider.java
@@ -27,7 +27,6 @@ package com.sun.media.sound;
 
 import javax.sound.midi.MidiDevice;
 
-
 /**
  * MIDI output device provider.
  *
@@ -44,16 +43,12 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
 
     private static final boolean enabled;
 
-    // STATIC
-
     static {
         // initialize
         Platform.initialize();
         enabled = Platform.isMidiIOEnabled();
     }
 
-    // CONSTRUCTOR
-
     /**
      * Required public no-arg constructor.
      */
@@ -61,8 +56,7 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
         if (Printer.trace) Printer.trace("MidiOutDeviceProvider: constructor");
     }
 
-    // implementation of abstract methods in AbstractMidiDeviceProvider
-
+    @Override
     AbstractMidiDeviceProvider.Info createInfo(int index) {
         if (!enabled) {
             return null;
@@ -70,6 +64,7 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
         return new MidiOutDeviceInfo(index, MidiOutDeviceProvider.class);
     }
 
+    @Override
     MidiDevice createDevice(AbstractMidiDeviceProvider.Info info) {
         if (enabled && (info instanceof MidiOutDeviceInfo)) {
             return new MidiOutDevice(info);
@@ -77,6 +72,7 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
         return null;
     }
 
+    @Override
     int getNumDevices() {
         if (!enabled) {
             if (Printer.debug)Printer.debug("MidiOutDevice not enabled, returning 0 devices");
@@ -85,14 +81,15 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
         return nGetNumDevices();
     }
 
+    @Override
     MidiDevice[] getDeviceCache() { return devices; }
+    @Override
     void setDeviceCache(MidiDevice[] devices) { MidiOutDeviceProvider.devices = devices; }
+    @Override
     Info[] getInfoCache() { return infos; }
+    @Override
     void setInfoCache(Info[] infos) { MidiOutDeviceProvider.infos = infos; }
 
-
-    // INNER CLASSES
-
     /**
      * Info class for MidiOutDevices.  Adds the
      * provider's Class to keep the provider class from being
@@ -113,9 +110,6 @@ public final class MidiOutDeviceProvider extends AbstractMidiDeviceProvider {
 
     } // class MidiOutDeviceInfo
 
-
-    // NATIVE METHODS
-
     private static native int nGetNumDevices();
     private static native String nGetName(int index);
     private static native String nGetVendor(int index);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java
index b68750ad416..97bfa2f5937 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java
@@ -77,7 +77,6 @@ public final class MidiUtils {
         return ((msg[1] & 0xFF) == META_END_OF_TRACK_TYPE) && (msg[2] == 0);
     }
 
-
     /** return if the given message is a meta tempo message */
     public static boolean isMetaTempo(MidiMessage midiMsg) {
         // first check if it is a META message at all
@@ -91,7 +90,6 @@ public final class MidiUtils {
         return ((msg[1] & 0xFF) == META_TEMPO_TYPE) && (msg[2] == 3);
     }
 
-
     /** parses this message for a META tempo message and returns
      * the tempo in MPQ, or -1 if this isn't a tempo message
      */
@@ -111,7 +109,6 @@ public final class MidiUtils {
         return tempo;
     }
 
-
     /**
      * converts
* 1 - MPQ-Tempo to BPM tempo
@@ -124,7 +121,6 @@ public final class MidiUtils { return ((double) 60000000l) / tempo; } - /** * convert tick to microsecond with given tempo. * Does not take tempo changes into account. @@ -145,7 +141,6 @@ public final class MidiUtils { return (long) ((((double)us) * resolution) / tempoMPQ); } - /** * Given a tick, convert to microsecond * @param cache tempo info and current tempo @@ -246,7 +241,6 @@ public final class MidiUtils { return tick; } - /** * Binary search for the event indexes of the track * @@ -283,7 +277,6 @@ public final class MidiUtils { return ret; } - public static final class TempoCache { long[] ticks; int[] tempos; // in MPQ @@ -310,7 +303,6 @@ public final class MidiUtils { refresh(seq); } - public synchronized void refresh(Sequence seq) { ArrayList list = new ArrayList<>(); Track[] tracks = seq.getTracks(); @@ -373,6 +365,5 @@ public final class MidiUtils { } return tempos[tempos.length - 1]; } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java index a6f9a608767..1ad53ff6cd5 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -32,95 +33,123 @@ package com.sun.media.sound; */ public abstract class ModelAbstractChannelMixer implements ModelChannelMixer { + @Override public abstract boolean process(float[][] buffer, int offset, int len); + @Override public abstract void stop(); + @Override public void allNotesOff() { } + @Override public void allSoundOff() { } + @Override public void controlChange(int controller, int value) { } + @Override public int getChannelPressure() { return 0; } + @Override public int getController(int controller) { return 0; } + @Override public boolean getMono() { return false; } + @Override public boolean getMute() { return false; } + @Override public boolean getOmni() { return false; } + @Override public int getPitchBend() { return 0; } + @Override public int getPolyPressure(int noteNumber) { return 0; } + @Override public int getProgram() { return 0; } + @Override public boolean getSolo() { return false; } + @Override public boolean localControl(boolean on) { return false; } + @Override public void noteOff(int noteNumber) { } + @Override public void noteOff(int noteNumber, int velocity) { } + @Override public void noteOn(int noteNumber, int velocity) { } + @Override public void programChange(int program) { } + @Override public void programChange(int bank, int program) { } + @Override public void resetAllControllers() { } + @Override public void setChannelPressure(int pressure) { } + @Override public void setMono(boolean on) { } + @Override public void setMute(boolean mute) { } + @Override public void setOmni(boolean on) { } + @Override public void setPitchBend(int bend) { } + @Override public void setPolyPressure(int noteNumber, int pressure) { } + @Override public void setSolo(boolean soloState) { } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java index 1c8f1413ac7..0bbb5466cb8 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelAbstractOscillator.java @@ -22,9 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; + import javax.sound.midi.Instrument; import javax.sound.midi.MidiChannel; import javax.sound.midi.Patch; @@ -51,15 +53,18 @@ public abstract class ModelAbstractOscillator public void init() { } + @Override public void close() throws IOException { } + @Override public void noteOff(int velocity) { on = false; } + @Override public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, - int velocity) { + int velocity) { this.channel = channel; this.voice = voice; this.noteNumber = noteNumber; @@ -67,6 +72,7 @@ public abstract class ModelAbstractOscillator on = true; } + @Override public int read(float[][] buffer, int offset, int len) throws IOException { return -1; } @@ -91,6 +97,7 @@ public abstract class ModelAbstractOscillator return on; } + @Override public void setPitch(float pitch) { this.pitch = pitch; } @@ -107,14 +114,17 @@ public abstract class ModelAbstractOscillator return samplerate; } + @Override public float getAttenuation() { return 0; } + @Override public int getChannels() { return 1; } + @Override public String getName() { return getClass().getName(); } @@ -123,6 +133,7 @@ public abstract class ModelAbstractOscillator return new Patch(0, 0); } + @Override public ModelOscillatorStream open(float samplerate) { ModelAbstractOscillator oscs; try { @@ -162,10 +173,12 @@ public abstract class ModelAbstractOscillator return sbk; } + @Override public String getDescription() { return getName(); } + @Override public Instrument getInstrument(Patch patch) { Instrument ins = getInstrument(); Patch p = ins.getPatch(); @@ -182,18 +195,22 @@ public abstract class ModelAbstractOscillator return ins; } + @Override public Instrument[] getInstruments() { return new Instrument[]{getInstrument()}; } + @Override public SoundbankResource[] getResources() { return new SoundbankResource[0]; } + @Override public String getVendor() { return null; } + @Override public String getVersion() { return null; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java index 9ba89f20491..028efffbd12 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBuffer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.ByteArrayInputStream; @@ -60,12 +61,14 @@ public final class ModelByteBuffer { left = capacity(); } + @Override public int available() throws IOException { if (left > Integer.MAX_VALUE) return Integer.MAX_VALUE; return (int)left; } + @Override public synchronized void mark(int readlimit) { try { mark = raf.getFilePointer(); @@ -75,15 +78,18 @@ public final class ModelByteBuffer { } } + @Override public boolean markSupported() { return true; } + @Override public synchronized void reset() throws IOException { raf.seek(mark); left = markleft; } + @Override public long skip(long n) throws IOException { if( n < 0) return 0; @@ -95,6 +101,7 @@ public final class ModelByteBuffer { return n; } + @Override public int read(byte b[], int off, int len) throws IOException { if (len > left) len = (int)left; @@ -107,6 +114,7 @@ public final class ModelByteBuffer { return len; } + @Override public int read(byte[] b) throws IOException { int len = b.length; if (len > left) @@ -120,6 +128,7 @@ public final class ModelByteBuffer { return len; } + @Override public int read() throws IOException { if (left == 0) return -1; @@ -130,6 +139,7 @@ public final class ModelByteBuffer { return b; } + @Override public void close() throws IOException { raf.close(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java index 33515f400d8..45fa2954211 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java @@ -22,14 +22,16 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; import java.io.InputStream; + import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioFormat.Encoding; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.AudioFormat.Encoding; /** * Wavetable oscillator for pre-loaded data. @@ -52,6 +54,7 @@ public final class ModelByteBufferWavetable implements ModelWavetable { bigendian = format.isBigEndian(); } + @Override public int read(byte[] b, int off, int len) throws IOException { int avail = available(); if (avail <= 0) @@ -82,6 +85,7 @@ public final class ModelByteBufferWavetable implements ModelWavetable { return len; } + @Override public long skip(long n) throws IOException { int avail = available(); if (avail <= 0) @@ -93,10 +97,12 @@ public final class ModelByteBufferWavetable implements ModelWavetable { return super.skip(n); } + @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + @Override public int read() throws IOException { byte[] b = new byte[1]; int ret = read(b, 0, 1); @@ -105,19 +111,23 @@ public final class ModelByteBufferWavetable implements ModelWavetable { return 0 & 0xFF; } + @Override public boolean markSupported() { return true; } + @Override public int available() throws IOException { return (int)buffer.capacity() + (int)buffer8.capacity() - pos - pos2; } + @Override public synchronized void mark(int readlimit) { markpos = pos; markpos2 = pos2; } + @Override public synchronized void reset() throws IOException { pos = markpos; pos2 = markpos2; @@ -189,6 +199,7 @@ public final class ModelByteBufferWavetable implements ModelWavetable { return format; } + @Override public AudioFloatInputStream openStream() { if (buffer == null) return null; @@ -230,16 +241,19 @@ public final class ModelByteBufferWavetable implements ModelWavetable { (int)buffer.arrayOffset(), (int)buffer.capacity()); } + @Override public int getChannels() { return getFormat().getChannels(); } + @Override public ModelOscillatorStream open(float samplerate) { // ModelWavetableOscillator doesn't support ModelOscillatorStream return null; } // attenuation is in cB + @Override public float getAttenuation() { return attenuation; } @@ -248,6 +262,7 @@ public final class ModelByteBufferWavetable implements ModelWavetable { this.attenuation = attenuation; } + @Override public float getLoopLength() { return loopLength; } @@ -256,6 +271,7 @@ public final class ModelByteBufferWavetable implements ModelWavetable { this.loopLength = loopLength; } + @Override public float getLoopStart() { return loopStart; } @@ -268,10 +284,12 @@ public final class ModelByteBufferWavetable implements ModelWavetable { this.loopType = loopType; } + @Override public int getLoopType() { return loopType; } + @Override public float getPitchcorrection() { return pitchcorrection; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java index 4be6448f2a9..4058df93807 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelChannelMixer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.MidiChannel; @@ -42,9 +43,9 @@ import javax.sound.midi.MidiChannel; public interface ModelChannelMixer extends MidiChannel { // Used to process input audio from voices mix. - public boolean process(float[][] buffer, int offset, int len); + boolean process(float[][] buffer, int offset, int len); // Is used to trigger that this mixer is not be used // and it should fade out. - public void stop(); + void stop(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java index 4b10cfad0a1..d4e6159e019 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelConnectionBlock.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java index f1fe44e5c66..d3d0c1a8438 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDestination.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java index fa5543a835b..a6be739c01a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirectedPlayer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -32,5 +33,5 @@ package com.sun.media.sound; */ public interface ModelDirectedPlayer { - public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks); + void play(int performerIndex, ModelConnectionBlock[] connectionBlocks); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java index fb452e453c8..a595de94a8a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelDirector.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -38,9 +39,9 @@ package com.sun.media.sound; */ public interface ModelDirector { - public void noteOn(int noteNumber, int velocity); + void noteOn(int noteNumber, int velocity); - public void noteOff(int noteNumber, int velocity); + void noteOff(int noteNumber, int velocity); - public void close(); + void close(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java index 2e07fa13efc..6f0445f7fc3 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelIdentifier.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -134,6 +135,7 @@ public final class ModelIdentifier { this.variable = variable; } + @Override public int hashCode() { int hashcode = instance; if(object != null) hashcode |= object.hashCode(); @@ -141,6 +143,7 @@ public final class ModelIdentifier { return hashcode; } + @Override public boolean equals(Object obj) { if (!(obj instanceof ModelIdentifier)) return false; @@ -159,6 +162,7 @@ public final class ModelIdentifier { return true; } + @Override public String toString() { if (variable == null) { return object + "[" + instance + "]"; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java index 27e82c9fa6e..5ea60d25f71 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrument.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.Instrument; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java index 3eb68d9ea24..016bd24490c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelInstrumentComparator.java @@ -22,9 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Comparator; + import javax.sound.midi.Instrument; import javax.sound.midi.Patch; @@ -36,6 +38,7 @@ import javax.sound.midi.Patch; */ public final class ModelInstrumentComparator implements Comparator { + @Override public int compare(Instrument arg0, Instrument arg1) { Patch p0 = arg0.getPatch(); Patch p1 = arg1.getPatch(); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java index ed0e978a869..66bf61d25f2 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelMappedInstrument.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.MidiChannel; @@ -42,21 +43,25 @@ public final class ModelMappedInstrument extends ModelInstrument { this.ins = ins; } + @Override public Object getData() { return ins.getData(); } + @Override public ModelPerformer[] getPerformers() { return ins.getPerformers(); } + @Override public ModelDirector getDirector(ModelPerformer[] performers, - MidiChannel channel, ModelDirectedPlayer player) { + MidiChannel channel, ModelDirectedPlayer player) { return ins.getDirector(performers, channel, player); } + @Override public ModelChannelMixer getChannelMixer(MidiChannel channel, - AudioFormat format) { + AudioFormat format) { return ins.getChannelMixer(channel, format); } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java index a00409c3712..569b74d2820 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillator.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -32,13 +33,13 @@ package com.sun.media.sound; */ public interface ModelOscillator { - public int getChannels(); + int getChannels(); /** * Attenuation is in cB. * @return */ - public float getAttenuation(); + float getAttenuation(); - public ModelOscillatorStream open(float samplerate); + ModelOscillatorStream open(float samplerate); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java index 762905dec64..86f266f2167 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelOscillatorStream.java @@ -22,9 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; + import javax.sound.midi.MidiChannel; import javax.sound.midi.VoiceStatus; @@ -35,14 +37,14 @@ import javax.sound.midi.VoiceStatus; */ public interface ModelOscillatorStream { - public void setPitch(float pitch); // Pitch is in cents! + void setPitch(float pitch); // Pitch is in cents! - public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, - int velocity); + void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, + int velocity); - public void noteOff(int velocity); + void noteOff(int velocity); - public int read(float[][] buffer, int offset, int len) throws IOException; + int read(float[][] buffer, int offset, int len) throws IOException; - public void close() throws IOException; + void close() throws IOException; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java index d8cfc611c86..9c0c187cc78 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPatch.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.Patch; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java index 661070c0d74..aed637900ef 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelPerformer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -35,9 +36,9 @@ import java.util.List; */ public final class ModelPerformer { - private final List oscillators = new ArrayList(); - private List connectionBlocks - = new ArrayList(); + private final List oscillators = new ArrayList<>(); + private List connectionBlocks = new ArrayList<>(); + private int keyFrom = 0; private int keyTo = 127; private int velFrom = 0; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java index f64f9c8b364..28a9461284c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelSource.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java index 115f28a6fad..a13cac95640 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardDirector.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; @@ -52,9 +53,11 @@ public final class ModelStandardDirector implements ModelDirector { } } + @Override public void close() { } + @Override public void noteOff(int noteNumber, int velocity) { if (!noteOffUsed) return; @@ -70,6 +73,7 @@ public final class ModelStandardDirector implements ModelDirector { } } + @Override public void noteOn(int noteNumber, int velocity) { if (!noteOnUsed) return; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java index a0c2aff39dd..f6b9908e9d4 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardIndexedDirector.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; @@ -156,9 +157,11 @@ public final class ModelStandardIndexedDirector implements ModelDirector { } } + @Override public void close() { } + @Override public void noteOff(int noteNumber, int velocity) { if (!noteOffUsed) return; @@ -172,6 +175,7 @@ public final class ModelStandardIndexedDirector implements ModelDirector { } } + @Override public void noteOn(int noteNumber, int velocity) { if (!noteOnUsed) return; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java index c3e7fcb9b9b..ee24134585d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelStandardTransform.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -73,6 +74,7 @@ public final class ModelStandardTransform implements ModelTransform { this.transform = transform; } + @Override public double transform(double value) { double s; double a; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java index cbe0adb97b5..0512fcd2be4 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelTransform.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,5 +32,5 @@ package com.sun.media.sound; */ public interface ModelTransform { - public abstract double transform(double value); + double transform(double value); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java index 2884181bbf9..165bc6105a1 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ModelWavetable.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,19 +32,19 @@ package com.sun.media.sound; */ public interface ModelWavetable extends ModelOscillator { - public static final int LOOP_TYPE_OFF = 0; - public static final int LOOP_TYPE_FORWARD = 1; - public static final int LOOP_TYPE_RELEASE = 2; - public static final int LOOP_TYPE_PINGPONG = 4; - public static final int LOOP_TYPE_REVERSE = 8; + int LOOP_TYPE_OFF = 0; + int LOOP_TYPE_FORWARD = 1; + int LOOP_TYPE_RELEASE = 2; + int LOOP_TYPE_PINGPONG = 4; + int LOOP_TYPE_REVERSE = 8; - public AudioFloatInputStream openStream(); + AudioFloatInputStream openStream(); - public float getLoopLength(); + float getLoopLength(); - public float getLoopStart(); + float getLoopStart(); - public int getLoopType(); + int getLoopType(); - public float getPitchcorrection(); + float getPitchcorrection(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java index 5ba0558099d..edb26d5c9a5 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PCMtoPCMCodec.java @@ -40,7 +40,6 @@ import javax.sound.sampled.AudioSystem; */ public final class PCMtoPCMCodec extends SunCodec { - private static final AudioFormat.Encoding[] inputEncodings = { AudioFormat.Encoding.PCM_SIGNED, AudioFormat.Encoding.PCM_UNSIGNED, @@ -59,8 +58,7 @@ public final class PCMtoPCMCodec extends SunCodec { super( inputEncodings, outputEncodings); } - // NEW CODE - + @Override public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat) { final int sampleSize = sourceFormat.getSampleSizeInBits(); @@ -88,9 +86,7 @@ public final class PCMtoPCMCodec extends SunCodec { return new AudioFormat.Encoding[0]; } - - /** - */ + @Override public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){ Objects.requireNonNull(targetEncoding); @@ -113,9 +109,7 @@ public final class PCMtoPCMCodec extends SunCodec { return formatArray; } - - /** - */ + @Override public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream) { if( isConversionSupported(targetEncoding, sourceStream.getFormat()) ) { @@ -136,9 +130,8 @@ public final class PCMtoPCMCodec extends SunCodec { } } - /** - * use old code - */ + + @Override public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){ if (!isConversionSupported(targetFormat, sourceStream.getFormat())) throw new IllegalArgumentException("Unsupported conversion: " @@ -147,11 +140,6 @@ public final class PCMtoPCMCodec extends SunCodec { return getConvertedStream( targetFormat, sourceStream ); } - - - - // OLD CODE - /** * Opens the codec with the specified parameters. * @param stream stream from which data to be processed should be read @@ -160,7 +148,6 @@ public final class PCMtoPCMCodec extends SunCodec { * @throws IllegalArgumentException if the format combination supplied is * not supported. */ - /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {*/ private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { AudioInputStream cs = null; @@ -172,13 +159,11 @@ public final class PCMtoPCMCodec extends SunCodec { cs = stream; } else { - cs = (AudioInputStream) (new PCMtoPCMCodecStream(stream, outputFormat)); + cs = new PCMtoPCMCodecStream(stream, outputFormat); } return cs; } - - /** * Obtains the set of output formats supported by the codec * given a particular input format. @@ -186,7 +171,6 @@ public final class PCMtoPCMCodec extends SunCodec { * returns an array of length 0. * @return array of supported output formats. */ - /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */ private AudioFormat[] getOutputFormats(AudioFormat inputFormat) { Vector formats = new Vector<>(); @@ -350,7 +334,6 @@ public final class PCMtoPCMCodec extends SunCodec { return formatArray; } - class PCMtoPCMCodecStream extends AudioInputStream { private final int PCM_SWITCH_SIGNED_8BIT = 1; @@ -460,7 +443,7 @@ public final class PCMtoPCMCodec extends SunCodec { * Note that this only works for sign conversions. * Other conversions require a read of at least 2 bytes. */ - + @Override public int read() throws IOException { // $$jb: do we want to implement this function? @@ -489,12 +472,13 @@ public final class PCMtoPCMCodec extends SunCodec { } } - + @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + @Override public int read(byte[] b, int off, int len) throws IOException { @@ -589,9 +573,5 @@ public final class PCMtoPCMCodec extends SunCodec { } } } - - - } // end class PCMtoPCMCodecStream - } // end class PCMtoPCMCodec diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java index 09ece592c93..3b24ceb679a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Platform.java @@ -29,8 +29,6 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.StringTokenizer; - - /** * Audio configuration class for exposing attributes specific to the platform or system. * @@ -39,9 +37,6 @@ import java.util.StringTokenizer; */ final class Platform { - - // STATIC FINAL CHARACTERISTICS - // native library we need to load private static final String libNameMain = "jsound"; private static final String libNameALSA = "jsoundalsa"; @@ -74,37 +69,26 @@ final class Platform { readProperties(); } - /** * Private constructor. */ private Platform() { } - - // METHODS FOR INTERNAL IMPLEMENTATION USE - - /** * Dummy method for forcing initialization. */ static void initialize() { - if(Printer.trace)Printer.trace("Platform: initialize()"); } - /** * Determine whether the system is big-endian. */ static boolean isBigEndian() { - return bigEndian; } - - // PRIVATE METHODS - /** * Load the native library or libraries. */ @@ -147,7 +131,6 @@ final class Platform { } } - static boolean isMidiIOEnabled() { return isFeatureLibLoaded(FEATURE_MIDIIO); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java index 8bf34bd8fdf..e4b795abdf2 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixer.java @@ -27,14 +27,13 @@ package com.sun.media.sound; import java.util.Vector; +import javax.sound.sampled.BooleanControl; +import javax.sound.sampled.CompoundControl; import javax.sound.sampled.Control; +import javax.sound.sampled.FloatControl; import javax.sound.sampled.Line; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Port; -import javax.sound.sampled.BooleanControl; -import javax.sound.sampled.CompoundControl; -import javax.sound.sampled.FloatControl; - /** * A Mixer which only provides Ports. @@ -43,7 +42,6 @@ import javax.sound.sampled.FloatControl; */ final class PortMixer extends AbstractMixer { - // CONSTANTS private static final int SRC_UNKNOWN = 0x01; private static final int SRC_MICROPHONE = 0x02; private static final int SRC_LINE_IN = 0x03; @@ -56,15 +54,13 @@ final class PortMixer extends AbstractMixer { private static final int DST_LINE_OUT = 0x0400; private static final int DST_MASK = 0xFF00; - // INSTANCE VARIABLES - private Port.Info[] portInfos; + private final Port.Info[] portInfos; // cache of instantiated ports private PortMixerPort[] ports; // instance ID of the native implementation private long id = 0; - // CONSTRUCTOR PortMixer(PortMixerProvider.PortMixerInfo portMixerInfo) { // pass in Line.Info, mixer, controls super(portMixerInfo, // Mixer.Info @@ -121,9 +117,7 @@ final class PortMixer extends AbstractMixer { if (Printer.trace) Printer.trace("<< PortMixer: constructor completed"); } - - // ABSTRACT MIXER: ABSTRACT METHOD IMPLEMENTATIONS - + @Override public Line getLine(Line.Info info) throws LineUnavailableException { Line.Info fullInfo = getLineInfo(info); @@ -137,7 +131,7 @@ final class PortMixer extends AbstractMixer { throw new IllegalArgumentException("Line unsupported: " + info); } - + @Override public int getMaxLines(Line.Info info) { Line.Info fullInfo = getLineInfo(info); @@ -153,7 +147,7 @@ final class PortMixer extends AbstractMixer { return 0; } - + @Override protected void implOpen() throws LineUnavailableException { if (Printer.trace) Printer.trace(">> PortMixer: implOpen (id="+id+")"); @@ -163,6 +157,7 @@ final class PortMixer extends AbstractMixer { if (Printer.trace) Printer.trace("<< PortMixer: implOpen succeeded."); } + @Override protected void implClose() { if (Printer.trace) Printer.trace(">> PortMixer: implClose"); @@ -181,11 +176,11 @@ final class PortMixer extends AbstractMixer { if (Printer.trace) Printer.trace("<< PortMixer: implClose succeeded"); } + @Override protected void implStart() {} + @Override protected void implStop() {} - // IMPLEMENTATION HELPERS - private Port.Info getPortInfo(int portIndex, int type) { switch (type) { case SRC_UNKNOWN: return new PortInfo(nGetPortName(getID(), portIndex), true); @@ -223,8 +218,6 @@ final class PortMixer extends AbstractMixer { return id; } - // INNER CLASSES - /** * Private inner class representing a Port for the PortMixer. */ @@ -234,7 +227,6 @@ final class PortMixer extends AbstractMixer { private final int portIndex; private long id; - // CONSTRUCTOR private PortMixerPort(Port.Info info, PortMixer mixer, int portIndex) { @@ -243,11 +235,6 @@ final class PortMixer extends AbstractMixer { this.portIndex = portIndex; } - - // ABSTRACT METHOD IMPLEMENTATIONS - - // ABSTRACT LINE - void implOpen() throws LineUnavailableException { if (Printer.trace) Printer.trace(">> PortMixerPort: implOpen()."); long newID = ((PortMixer) mixer).getID(); @@ -286,7 +273,6 @@ final class PortMixer extends AbstractMixer { controls = new Control[0]; } - void implClose() { if (Printer.trace) Printer.trace(">> PortMixerPort: implClose()"); // get rid of controls @@ -294,9 +280,8 @@ final class PortMixer extends AbstractMixer { if (Printer.trace) Printer.trace("<< PortMixerPort: implClose() succeeded"); } - // METHOD OVERRIDES - // this is very similar to open(AudioFormat, int) in AbstractDataLine... + @Override public void open() throws LineUnavailableException { synchronized (mixer) { // if the line is not currently open, try to open it with this format and buffer size @@ -321,6 +306,7 @@ final class PortMixer extends AbstractMixer { } // this is very similar to close() in AbstractDataLine... + @Override public void close() { synchronized (mixer) { if (isOpen()) { @@ -342,7 +328,7 @@ final class PortMixer extends AbstractMixer { } // class PortMixerPort /** - * Private inner class representing a BooleanControl for PortMixerPort + * Private inner class representing a BooleanControl for PortMixerPort. */ private static final class BoolCtrl extends BooleanControl { // the handle to the native control function @@ -360,7 +346,6 @@ final class PortMixer extends AbstractMixer { return new BCT(name); } - private BoolCtrl(long controlID, String name) { this(controlID, createType(name)); } @@ -370,12 +355,14 @@ final class PortMixer extends AbstractMixer { this.controlID = controlID; } + @Override public void setValue(boolean value) { if (!closed) { nControlSetIntValue(controlID, value?1:0); } } + @Override public boolean getValue() { if (!closed) { // never use any cached values @@ -386,7 +373,7 @@ final class PortMixer extends AbstractMixer { } /** - * inner class for custom types + * inner class for custom types. */ private static final class BCT extends BooleanControl.Type { private BCT(String name) { @@ -396,7 +383,7 @@ final class PortMixer extends AbstractMixer { } /** - * Private inner class representing a CompoundControl for PortMixerPort + * Private inner class representing a CompoundControl for PortMixerPort. */ private static final class CompCtrl extends CompoundControl { private CompCtrl(String name, Control[] controls) { @@ -404,7 +391,7 @@ final class PortMixer extends AbstractMixer { } /** - * inner class for custom compound control types + * inner class for custom compound control types. */ private static final class CCT extends CompoundControl.Type { private CCT(String name) { @@ -414,7 +401,7 @@ final class PortMixer extends AbstractMixer { } /** - * Private inner class representing a BooleanControl for PortMixerPort + * Private inner class representing a BooleanControl for PortMixerPort. */ private static final class FloatCtrl extends FloatControl { // the handle to the native control function @@ -446,12 +433,14 @@ final class PortMixer extends AbstractMixer { this.controlID = controlID; } + @Override public void setValue(float value) { if (!closed) { nControlSetFloatValue(controlID, value); } } + @Override public float getValue() { if (!closed) { // never use any cached values @@ -462,7 +451,7 @@ final class PortMixer extends AbstractMixer { } /** - * inner class for custom types + * inner class for custom types. */ private static final class FCT extends FloatControl.Type { private FCT(String name) { @@ -472,7 +461,7 @@ final class PortMixer extends AbstractMixer { } /** - * Private inner class representing a port info + * Private inner class representing a port info. */ private static final class PortInfo extends Port.Info { private PortInfo(String name, boolean isSource) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java index ce7f3596a48..a6e3275a41a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/PortMixerProvider.java @@ -28,7 +28,6 @@ package com.sun.media.sound; import javax.sound.sampled.Mixer; import javax.sound.sampled.spi.MixerProvider; - /** * Port provider. * @@ -36,8 +35,6 @@ import javax.sound.sampled.spi.MixerProvider; */ public final class PortMixerProvider extends MixerProvider { - // STATIC VARIABLES - /** * Set of info objects for all port input devices on the system. */ @@ -48,18 +45,11 @@ public final class PortMixerProvider extends MixerProvider { */ private static PortMixer[] devices; - - // STATIC - static { // initialize Platform.initialize(); } - - // CONSTRUCTOR - - /** * Required public no-arg constructor. */ @@ -93,6 +83,7 @@ public final class PortMixerProvider extends MixerProvider { } } + @Override public Mixer.Info[] getMixerInfo() { synchronized (PortMixerProvider.class) { Mixer.Info[] localArray = new Mixer.Info[infos.length]; @@ -101,6 +92,7 @@ public final class PortMixerProvider extends MixerProvider { } } + @Override public Mixer getMixer(Mixer.Info info) { synchronized (PortMixerProvider.class) { for (int i = 0; i < infos.length; i++) { @@ -113,7 +105,6 @@ public final class PortMixerProvider extends MixerProvider { String.format("Mixer %s not supported by this provider", info)); } - private static Mixer getDevice(PortMixerInfo info) { int index = info.getIndex(); if (devices[index] == null) { @@ -122,9 +113,6 @@ public final class PortMixerProvider extends MixerProvider { return devices[index]; } - // INNER CLASSES - - /** * Info class for PortMixers. Adds an index value for * making native references to a particular device. @@ -144,7 +132,6 @@ public final class PortMixerProvider extends MixerProvider { } // class PortMixerInfo - // NATIVE METHODS private static native int nGetNumDevices(); private static native PortMixerInfo nNewPortMixerInfo(int mixerIndex); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java index 195ceedde08..7ece702f026 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidDataException.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java index 7b8d755509f..defa2418e77 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java index 255c42099ec..3da63707788 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.EOFException; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java index a417d6a16dc..805fd2d0c7f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFWriter.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.File; @@ -39,21 +40,21 @@ public final class RIFFWriter extends OutputStream { private interface RandomAccessWriter { - public void seek(long chunksizepointer) throws IOException; + void seek(long chunksizepointer) throws IOException; - public long getPointer() throws IOException; + long getPointer() throws IOException; - public void close() throws IOException; + void close() throws IOException; - public void write(int b) throws IOException; + void write(int b) throws IOException; - public void write(byte[] b, int off, int len) throws IOException; + void write(byte[] b, int off, int len) throws IOException; - public void write(byte[] bytes) throws IOException; + void write(byte[] bytes) throws IOException; - public long length() throws IOException; + long length() throws IOException; - public void setLength(long i) throws IOException; + void setLength(long i) throws IOException; } private static class RandomAccessFileWriter implements RandomAccessWriter { @@ -68,34 +69,42 @@ public final class RIFFWriter extends OutputStream { this.raf = new RandomAccessFile(name, "rw"); } + @Override public void seek(long chunksizepointer) throws IOException { raf.seek(chunksizepointer); } + @Override public long getPointer() throws IOException { return raf.getFilePointer(); } + @Override public void close() throws IOException { raf.close(); } + @Override public void write(int b) throws IOException { raf.write(b); } + @Override public void write(byte[] b, int off, int len) throws IOException { raf.write(b, off, len); } + @Override public void write(byte[] bytes) throws IOException { raf.write(bytes); } + @Override public long length() throws IOException { return raf.length(); } + @Override public void setLength(long i) throws IOException { raf.setLength(i); } @@ -113,19 +122,23 @@ public final class RIFFWriter extends OutputStream { this.stream = stream; } + @Override public void seek(long chunksizepointer) throws IOException { pos = (int) chunksizepointer; } + @Override public long getPointer() throws IOException { return pos; } + @Override public void close() throws IOException { stream.write(buff, 0, length); stream.close(); } + @Override public void write(int b) throws IOException { if (s == null) s = new byte[1]; @@ -133,6 +146,7 @@ public final class RIFFWriter extends OutputStream { write(s, 0, 1); } + @Override public void write(byte[] b, int off, int len) throws IOException { int newsize = pos + len; if (newsize > length) @@ -143,14 +157,17 @@ public final class RIFFWriter extends OutputStream { } } + @Override public void write(byte[] bytes) throws IOException { write(bytes, 0, bytes.length); } + @Override public long length() throws IOException { return length; } + @Override public void setLength(long i) throws IOException { length = (int) i; if (length > buff.length) { @@ -223,6 +240,7 @@ public final class RIFFWriter extends OutputStream { return writeoverride; } + @Override public void close() throws IOException { if (!open) return; @@ -245,6 +263,7 @@ public final class RIFFWriter extends OutputStream { raf = null; } + @Override public void write(int b) throws IOException { if (!writeoverride) { if (chunktype != 2) { @@ -259,6 +278,7 @@ public final class RIFFWriter extends OutputStream { raf.write(b); } + @Override public void write(byte b[], int off, int len) throws IOException { if (!writeoverride) { if (chunktype != 2) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java index fcb2a7af6fe..b0ae55001c3 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java @@ -27,14 +27,27 @@ package com.sun.media.sound; import java.io.IOException; import java.io.InputStream; - import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.WeakHashMap; -import javax.sound.midi.*; - +import javax.sound.midi.ControllerEventListener; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MetaEventListener; +import javax.sound.midi.MetaMessage; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiEvent; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; +import javax.sound.midi.Sequence; +import javax.sound.midi.Sequencer; +import javax.sound.midi.ShortMessage; +import javax.sound.midi.Synthesizer; +import javax.sound.midi.Track; +import javax.sound.midi.Transmitter; /** * A Real Time Sequencer @@ -48,8 +61,6 @@ import javax.sound.midi.*; final class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoConnectSequencer { - // STATIC VARIABLES - /** debugging flags */ private static final boolean DEBUG_PUMP = false; private static final boolean DEBUG_PUMP_ALL = false; @@ -73,7 +84,6 @@ final class RealTimeSequencer extends AbstractMidiDevice private static final Sequencer.SyncMode masterSyncMode = Sequencer.SyncMode.INTERNAL_CLOCK; private static final Sequencer.SyncMode slaveSyncMode = Sequencer.SyncMode.NO_SYNC; - /** * Sequence on which this sequencer is operating. */ @@ -87,14 +97,12 @@ final class RealTimeSequencer extends AbstractMidiDevice */ private double cacheTempoMPQ = -1; - /** * cache value for tempo factor until sequence is set * -1 means not set. */ private float cacheTempoFactor = -1; - /** if a particular track is muted */ private boolean[] trackMuted = null; /** if a particular track is solo */ @@ -108,47 +116,48 @@ final class RealTimeSequencer extends AbstractMidiDevice */ private volatile boolean running; - - /** the thread for pushing out the MIDI messages */ + /** + * the thread for pushing out the MIDI messages. + */ private PlayThread playThread; - /** - * True if we are recording + * True if we are recording. */ private volatile boolean recording; - /** - * List of tracks to which we're recording + * List of tracks to which we're recording. */ private final List recordingTracks = new ArrayList<>(); - private long loopStart = 0; private long loopEnd = -1; private int loopCount = 0; - /** - * Meta event listeners + * Meta event listeners. */ private final ArrayList metaEventListeners = new ArrayList<>(); - /** - * Control change listeners + * Control change listeners. */ private final ArrayList controllerEventListeners = new ArrayList<>(); - - /** automatic connection support */ + /** + * automatic connection support. + */ private boolean autoConnect = false; - /** if we need to autoconnect at next open */ + /** + * if we need to autoconnect at next open. + */ private boolean doAutoConnectAtNextOpen = false; - /** the receiver that this device is auto-connected to */ + /** + * the receiver that this device is auto-connected to. + */ Receiver autoConnectedReceiver = null; @@ -161,9 +170,9 @@ final class RealTimeSequencer extends AbstractMidiDevice if (Printer.trace) Printer.trace("<< RealTimeSequencer CONSTRUCTOR completed"); } - /* ****************************** SEQUENCER METHODS ******************** */ + @Override public synchronized void setSequence(Sequence sequence) throws InvalidMidiDataException { @@ -211,7 +220,7 @@ final class RealTimeSequencer extends AbstractMidiDevice if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + sequence +") completed"); } - + @Override public synchronized void setSequence(InputStream stream) throws IOException, InvalidMidiDataException { if (Printer.trace) Printer.trace(">> RealTimeSequencer: setSequence(" + stream +")"); @@ -229,12 +238,12 @@ final class RealTimeSequencer extends AbstractMidiDevice } - + @Override public Sequence getSequence() { return sequence; } - + @Override public synchronized void start() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: start()"); @@ -259,7 +268,7 @@ final class RealTimeSequencer extends AbstractMidiDevice if (Printer.trace) Printer.trace("<< RealTimeSequencer: start() completed"); } - + @Override public synchronized void stop() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: stop()"); @@ -280,12 +289,12 @@ final class RealTimeSequencer extends AbstractMidiDevice if (Printer.trace) Printer.trace("<< RealTimeSequencer: stop() completed"); } - + @Override public boolean isRunning() { return running; } - + @Override public void startRecording() { if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); @@ -295,7 +304,7 @@ final class RealTimeSequencer extends AbstractMidiDevice recording = true; } - + @Override public void stopRecording() { if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); @@ -303,12 +312,12 @@ final class RealTimeSequencer extends AbstractMidiDevice recording = false; } - + @Override public boolean isRecording() { return recording; } - + @Override public void recordEnable(Track track, int channel) { if (!findTrack(track)) { throw new IllegalArgumentException("Track does not exist in the current sequence"); @@ -325,7 +334,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } - + @Override public void recordDisable(Track track) { synchronized(recordingTracks) { RecordingTrack rc = RecordingTrack.get(recordingTracks, track); @@ -336,7 +345,6 @@ final class RealTimeSequencer extends AbstractMidiDevice } - private boolean findTrack(Track track) { boolean found = false; if (sequence != null) { @@ -351,14 +359,14 @@ final class RealTimeSequencer extends AbstractMidiDevice return found; } - + @Override public float getTempoInBPM() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInBPM() "); return (float) MidiUtils.convertTempo(getTempoInMPQ()); } - + @Override public void setTempoInBPM(float bpm) { if (Printer.trace) Printer.trace(">> RealTimeSequencer: setTempoInBPM() "); if (bpm <= 0) { @@ -369,7 +377,7 @@ final class RealTimeSequencer extends AbstractMidiDevice setTempoInMPQ((float) MidiUtils.convertTempo((double) bpm)); } - + @Override public float getTempoInMPQ() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInMPQ() "); @@ -389,7 +397,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return getDataPump().getTempoMPQ(); } - + @Override public void setTempoInMPQ(float mpq) { if (mpq <= 0) { // should throw IllegalArgumentException @@ -410,7 +418,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public void setTempoFactor(float factor) { if (factor <= 0) { // should throw IllegalArgumentException @@ -428,7 +436,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public float getTempoFactor() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoFactor() "); @@ -441,7 +449,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return getDataPump().getTempoFactor(); } - + @Override public long getTickLength() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickLength() "); @@ -452,7 +460,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return sequence.getTickLength(); } - + @Override public synchronized long getTickPosition() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickPosition() "); @@ -463,7 +471,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return getDataPump().getTickPos(); } - + @Override public synchronized void setTickPosition(long tick) { if (tick < 0) { // should throw IllegalArgumentException @@ -486,7 +494,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public long getMicrosecondLength() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondLength() "); @@ -497,7 +505,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return sequence.getMicrosecondLength(); } - + @Override public long getMicrosecondPosition() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondPosition() "); @@ -509,7 +517,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public void setMicrosecondPosition(long microseconds) { if (microseconds < 0) { // should throw IllegalArgumentException @@ -534,34 +542,34 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public void setMasterSyncMode(Sequencer.SyncMode sync) { // not supported } - + @Override public Sequencer.SyncMode getMasterSyncMode() { return masterSyncMode; } - + @Override public Sequencer.SyncMode[] getMasterSyncModes() { Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[masterSyncModes.length]; System.arraycopy(masterSyncModes, 0, returnedModes, 0, masterSyncModes.length); return returnedModes; } - + @Override public void setSlaveSyncMode(Sequencer.SyncMode sync) { // not supported } - + @Override public Sequencer.SyncMode getSlaveSyncMode() { return slaveSyncMode; } - + @Override public Sequencer.SyncMode[] getSlaveSyncModes() { Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[slaveSyncModes.length]; System.arraycopy(slaveSyncModes, 0, returnedModes, 0, slaveSyncModes.length); @@ -577,8 +585,7 @@ final class RealTimeSequencer extends AbstractMidiDevice return 0; } - - + @Override public synchronized void setTrackMute(int track, boolean mute) { int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; @@ -589,14 +596,14 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public synchronized boolean getTrackMute(int track) { if (track < 0 || track >= getTrackCount()) return false; if (trackMuted == null || trackMuted.length <= track) return false; return trackMuted[track]; } - + @Override public synchronized void setTrackSolo(int track, boolean solo) { int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; @@ -607,14 +614,14 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public synchronized boolean getTrackSolo(int track) { if (track < 0 || track >= getTrackCount()) return false; if (trackSolo == null || trackSolo.length <= track) return false; return trackSolo[track]; } - + @Override public boolean addMetaEventListener(MetaEventListener listener) { synchronized(metaEventListeners) { if (! metaEventListeners.contains(listener)) { @@ -625,7 +632,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public void removeMetaEventListener(MetaEventListener listener) { synchronized(metaEventListeners) { int index = metaEventListeners.indexOf(listener); @@ -635,7 +642,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers) { synchronized(controllerEventListeners) { @@ -663,7 +670,7 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - + @Override public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers) { synchronized(controllerEventListeners) { ControllerListElement cve = null; @@ -690,9 +697,9 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - ////////////////// LOOPING (added in 1.5) /////////////////////// + @Override public void setLoopStartPoint(long tick) { if ((tick > getTickLength()) || ((loopEnd != -1) && (tick > loopEnd)) @@ -702,10 +709,12 @@ final class RealTimeSequencer extends AbstractMidiDevice loopStart = tick; } + @Override public long getLoopStartPoint() { return loopStart; } + @Override public void setLoopEndPoint(long tick) { if ((tick > getTickLength()) || ((loopStart > tick) && (tick != -1)) @@ -715,10 +724,12 @@ final class RealTimeSequencer extends AbstractMidiDevice loopEnd = tick; } + @Override public long getLoopEndPoint() { return loopEnd; } + @Override public void setLoopCount(int count) { if (count != LOOP_CONTINUOUSLY && count < 0) { @@ -730,15 +741,14 @@ final class RealTimeSequencer extends AbstractMidiDevice } } + @Override public int getLoopCount() { return loopCount; } - /* *********************************** play control ************************* */ - /* - */ + @Override protected void implOpen() throws MidiUnavailableException { if (Printer.trace) Printer.trace(">> RealTimeSequencer: implOpen()"); @@ -820,14 +830,15 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - /** populate the caches with the current values */ + /** + * populate the caches with the current values. + */ private synchronized void setCaches() { cacheTempoFactor = getTempoFactor(); cacheTempoMPQ = getTempoInMPQ(); } - - + @Override protected synchronized void implClose() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: implClose() "); @@ -882,7 +893,6 @@ final class RealTimeSequencer extends AbstractMidiDevice if (Printer.trace) Printer.trace("<< RealTimeSequencer: implStart() completed"); } - void implStop() { if (Printer.trace) Printer.trace(">> RealTimeSequencer: implStop()"); @@ -953,8 +963,6 @@ final class RealTimeSequencer extends AbstractMidiDevice getEventDispatcher().sendAudioEvents(message, sendToListeners); } - - private boolean needCaching() { return !isOpen() || (sequence == null) || (playThread == null); } @@ -988,42 +996,39 @@ final class RealTimeSequencer extends AbstractMidiDevice return array; } - // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS + @Override protected boolean hasReceivers() { return true; } // for recording + @Override protected Receiver createReceiver() throws MidiUnavailableException { return new SequencerReceiver(); } - + @Override protected boolean hasTransmitters() { return true; } - + @Override protected Transmitter createTransmitter() throws MidiUnavailableException { return new SequencerTransmitter(); } - // interface AutoConnectSequencer + @Override public void setAutoConnect(Receiver autoConnectedReceiver) { this.autoConnect = (autoConnectedReceiver != null); this.autoConnectedReceiver = autoConnectedReceiver; } - - - // INNER CLASSES - /** * An own class to distinguish the class name from - * the transmitter of other devices + * the transmitter of other devices. */ private class SequencerTransmitter extends BasicTransmitter { private SequencerTransmitter() { @@ -1031,9 +1036,9 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - final class SequencerReceiver extends AbstractReceiver { + @Override void implSend(MidiMessage message, long timeStamp) { if (recording) { long tickPos = 0; @@ -1080,7 +1085,6 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - private static class RealTimeSequencerInfo extends MidiDevice.Info { private static final String name = "Real Time Sequencer"; @@ -1093,7 +1097,6 @@ final class RealTimeSequencer extends AbstractMidiDevice } } // class Info - private class ControllerListElement { // $$jb: using an array for controllers b/c its @@ -1202,7 +1205,6 @@ final class RealTimeSequencer extends AbstractMidiDevice } // class ControllerListElement - static class RecordingTrack { private final Track track; @@ -1244,7 +1246,6 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - final class PlayThread implements Runnable { private Thread thread; private final Object lock = new Object(); @@ -1351,13 +1352,13 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - /** * Main process loop driving the media flow. * * Make sure to NOT synchronize on RealTimeSequencer * anywhere here (even implicit). That is a sure deadlock! */ + @Override public void run() { while (!interrupted) { @@ -1409,10 +1410,9 @@ final class RealTimeSequencer extends AbstractMidiDevice } } - /** * class that does the actual dispatching of events, - * used to be in native in MMAPI + * used to be in native in MMAPI. */ private class DataPump { private float currTempo; // MPQ tempo @@ -1434,7 +1434,6 @@ final class RealTimeSequencer extends AbstractMidiDevice //private sun.misc.Perf perf = sun.misc.Perf.getPerf(); //private long perfFreq = perf.highResFrequency(); - DataPump() { init(); } @@ -1516,8 +1515,6 @@ final class RealTimeSequencer extends AbstractMidiDevice trackDisabled = newDisabled; } - - synchronized void setSequence(Sequence seq) { if (seq == null) { init(); @@ -1568,7 +1565,6 @@ final class RealTimeSequencer extends AbstractMidiDevice if (DEBUG_PUMP) Printer.println(" noteOff: sent "+done+" messages."); } - private boolean[] makeDisabledArray() { if (tracks == null) { return null; @@ -1656,11 +1652,10 @@ final class RealTimeSequencer extends AbstractMidiDevice if (DEBUG_PUMP) Printer.println(" sendNoteOffIfOn: sent "+done+" messages."); } - /** * Runtime application of mute/solo: * if a track is muted that was previously playing, send - * note off events for all currently playing notes + * note off events for all currently playing notes. */ private void applyDisabledTracks(boolean[] oldDisabled, boolean[] newDisabled) { byte[][] tempArray = null; @@ -1781,8 +1776,9 @@ final class RealTimeSequencer extends AbstractMidiDevice if (DEBUG_PUMP) Printer.println(" chaseTrackEvents track "+trackNum+": sent "+numControllersSent+" controllers."); } - - /** chase controllers and program for all tracks */ + /** + * chase controllers and program for all tracks. + */ synchronized void chaseEvents(long startTick, long endTick) { if (DEBUG_PUMP) Printer.println(">> chaseEvents from tick "+startTick+".."+(endTick-1)); byte[][] tempArray = new byte[128][16]; @@ -1797,7 +1793,6 @@ final class RealTimeSequencer extends AbstractMidiDevice if (DEBUG_PUMP) Printer.println("<< chaseEvents"); } - // playback related methods (pumping) private long getCurrentTimeMillis() { @@ -1900,7 +1895,6 @@ final class RealTimeSequencer extends AbstractMidiDevice return changesPending; } - /** the main pump method * @return true if end of sequence is reached */ @@ -2078,7 +2072,5 @@ final class RealTimeSequencer extends AbstractMidiDevice return EOM; } - } // class DataPump - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java index b06d6dbc0ca..99dbbd69ab5 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/ReferenceCountingDevice.java @@ -29,8 +29,6 @@ import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Transmitter; - - /** MidiDevice that can use reference counting for open/close. * This interface is intended to be used by MidiSystem.getTransmitter() and * MidiSystem.getReceiver(). @@ -42,11 +40,11 @@ public interface ReferenceCountingDevice { * This method is similar to MidiDevice.getReceiver(). However, by calling this one, * the device is opened implicitly. This is needed by MidiSystem.getReceiver(). */ - public Receiver getReceiverReferenceCounting() throws MidiUnavailableException; + Receiver getReceiverReferenceCounting() throws MidiUnavailableException; /** Retrieve a Transmitter that opens the device implicitly. * This method is similar to MidiDevice.getTransmitter(). However, by calling this one, * the device is opened implicitly. This is needed by MidiSystem.getTransmitter(). */ - public Transmitter getTransmitterReferenceCounting() throws MidiUnavailableException; + Transmitter getTransmitterReferenceCounting() throws MidiUnavailableException; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java index 22ed404ddf8..f59828b9408 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2GlobalRegion.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java index 580882ba765..137dd1a5875 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Instrument.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -45,8 +46,7 @@ public final class SF2Instrument extends ModelInstrument { long genre = 0; long morphology = 0; SF2GlobalRegion globalregion = null; - List regions - = new ArrayList(); + List regions = new ArrayList<>(); public SF2Instrument() { super(null, null, null, null); @@ -56,6 +56,7 @@ public final class SF2Instrument extends ModelInstrument { super(soundbank, null, null, null); } + @Override public String getName() { return name; } @@ -64,6 +65,7 @@ public final class SF2Instrument extends ModelInstrument { this.name = name; } + @Override public Patch getPatch() { if (bank == 128) return new ModelPatch(0, preset, true); @@ -81,6 +83,7 @@ public final class SF2Instrument extends ModelInstrument { } } + @Override public Object getData() { return null; } @@ -121,6 +124,7 @@ public final class SF2Instrument extends ModelInstrument { globalregion = zone; } + @Override public String toString() { if (bank == 128) return "Drumkit: " + name + " preset #" + preset; @@ -129,6 +133,7 @@ public final class SF2Instrument extends ModelInstrument { + " preset #" + preset; } + @Override public ModelPerformer[] getPerformers() { int performercount = 0; for (SF2InstrumentRegion presetzone : regions) @@ -138,7 +143,7 @@ public final class SF2Instrument extends ModelInstrument { SF2GlobalRegion presetglobal = globalregion; for (SF2InstrumentRegion presetzone : regions) { - Map pgenerators = new HashMap(); + Map pgenerators = new HashMap<>(); pgenerators.putAll(presetzone.getGenerators()); if (presetglobal != null) pgenerators.putAll(presetglobal.getGenerators()); @@ -267,7 +272,7 @@ public final class SF2Instrument extends ModelInstrument { if (buff24 != null) osc.set8BitExtensionBuffer(buff24); - Map generators = new HashMap(); + Map generators = new HashMap<>(); if (layerglobal != null) generators.putAll(layerglobal.getGenerators()); generators.putAll(layerzone.getGenerators()); @@ -608,6 +613,7 @@ public final class SF2Instrument extends ModelInstrument { new ModelConnectionBlock( new ModelSource(ModelSource.SOURCE_NOTEON_VELOCITY, new ModelTransform() { + @Override public double transform(double value) { if (value < 0.5) return 1 - value * 2; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java index 87a62c42e05..e966a295314 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2InstrumentRegion.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java index e0bc76a4f9d..455bae429b8 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Layer.java @@ -38,7 +38,7 @@ public final class SF2Layer extends SoundbankResource { String name = ""; SF2GlobalRegion globalregion = null; - List regions = new ArrayList(); + List regions = new ArrayList<>(); public SF2Layer(SF2Soundbank soundBank) { super(soundBank, null, null); @@ -48,10 +48,12 @@ public final class SF2Layer extends SoundbankResource { super(null, null, null); } + @Override public Object getData() { return null; } + @Override public String getName() { return name; } @@ -72,6 +74,7 @@ public final class SF2Layer extends SoundbankResource { globalregion = zone; } + @Override public String toString() { return "Layer: " + name; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java index 8833e384c3e..39044e59534 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2LayerRegion.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java index 11930714219..4acf6851bf0 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Modulator.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java index 264c3f9038c..8b9bec95de2 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Region.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -97,8 +98,8 @@ public class SF2Region { public static final int GENERATOR_OVERRIDINGROOTKEY = 58; public static final int GENERATOR_UNUSED5 = 59; public static final int GENERATOR_ENDOPR = 60; - protected Map generators = new HashMap(); - protected List modulators = new ArrayList(); + protected Map generators = new HashMap<>(); + protected List modulators = new ArrayList<>(); public Map getGenerators() { return generators; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java index 4a2f0fc58d7..c0d97c173c9 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Sample.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.InputStream; @@ -57,6 +58,7 @@ public final class SF2Sample extends SoundbankResource { super(null, null, AudioInputStream.class); } + @Override public Object getData() { AudioFormat format = getFormat(); @@ -146,6 +148,7 @@ public final class SF2Sample extends SoundbankResource { } */ + @Override public String getName() { return name; } @@ -210,6 +213,7 @@ public final class SF2Sample extends SoundbankResource { this.startLoop = startLoop; } + @Override public String toString() { return "Sample: " + name; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java index d45d50162bb..7025a83bd81 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2Soundbank.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.File; @@ -81,9 +82,9 @@ public final class SF2Soundbank implements Soundbank { private ModelByteBuffer sampleData24 = null; private File sampleFile = null; private boolean largeFormat = false; - private final List instruments = new ArrayList(); - private final List layers = new ArrayList(); - private final List samples = new ArrayList(); + private final List instruments = new ArrayList<>(); + private final List layers = new ArrayList<>(); + private final List samples = new ArrayList<>(); public SF2Soundbank() { } @@ -224,19 +225,15 @@ public final class SF2Soundbank implements Soundbank { private void readPdtaChunk(RIFFReader riff) throws IOException { - List presets = new ArrayList(); - List presets_bagNdx = new ArrayList(); - List presets_splits_gen - = new ArrayList(); - List presets_splits_mod - = new ArrayList(); + List presets = new ArrayList<>(); + List presets_bagNdx = new ArrayList<>(); + List presets_splits_gen = new ArrayList<>(); + List presets_splits_mod = new ArrayList<>(); - List instruments = new ArrayList(); - List instruments_bagNdx = new ArrayList(); - List instruments_splits_gen - = new ArrayList(); - List instruments_splits_mod - = new ArrayList(); + List instruments = new ArrayList<>(); + List instruments_bagNdx = new ArrayList<>(); + List instruments_splits_gen = new ArrayList<>(); + List instruments_splits_mod = new ArrayList<>(); while (riff.hasNextChunk()) { RIFFReader chunk = riff.nextChunk(); @@ -830,18 +827,22 @@ public final class SF2Soundbank implements Soundbank { } + @Override public String getName() { return name; } + @Override public String getVersion() { return major + "." + minor; } + @Override public String getVendor() { return engineers; } + @Override public String getDescription() { return comments; } @@ -858,6 +859,7 @@ public final class SF2Soundbank implements Soundbank { comments = s; } + @Override public SoundbankResource[] getResources() { SoundbankResource[] resources = new SoundbankResource[layers.size() + samples.size()]; @@ -869,6 +871,7 @@ public final class SF2Soundbank implements Soundbank { return resources; } + @Override public SF2Instrument[] getInstruments() { SF2Instrument[] inslist_array = instruments.toArray(new SF2Instrument[instruments.size()]); @@ -884,6 +887,7 @@ public final class SF2Soundbank implements Soundbank { return samples.toArray(new SF2Sample[samples.size()]); } + @Override public Instrument getInstrument(Patch patch) { int program = patch.getProgram(); int bank = patch.getBank(); @@ -972,11 +976,11 @@ public final class SF2Soundbank implements Soundbank { public void removeResource(SoundbankResource resource) { if (resource instanceof SF2Instrument) - instruments.remove((SF2Instrument)resource); + instruments.remove(resource); if (resource instanceof SF2Layer) - layers.remove((SF2Layer)resource); + layers.remove(resource); if (resource instanceof SF2Sample) - samples.remove((SF2Sample)resource); + samples.remove(resource); } public void addInstrument(SF2Instrument resource) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java index a61094fb4df..312c16904e4 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SF2SoundbankReader.java @@ -22,12 +22,14 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; + import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.Soundbank; import javax.sound.midi.spi.SoundbankReader; @@ -40,6 +42,7 @@ import javax.sound.midi.spi.SoundbankReader; */ public final class SF2SoundbankReader extends SoundbankReader { + @Override public Soundbank getSoundbank(URL url) throws InvalidMidiDataException, IOException { try { @@ -51,6 +54,7 @@ public final class SF2SoundbankReader extends SoundbankReader { } } + @Override public Soundbank getSoundbank(InputStream stream) throws InvalidMidiDataException, IOException { try { @@ -62,6 +66,7 @@ public final class SF2SoundbankReader extends SoundbankReader { } } + @Override public Soundbank getSoundbank(File file) throws InvalidMidiDataException, IOException { try { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java index af4a35ef9ff..682a267745f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleInstrument.java @@ -22,10 +22,12 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; import java.util.List; + import javax.sound.midi.Patch; /** @@ -48,8 +50,7 @@ public class SimpleInstrument extends ModelInstrument { protected int bank = 0; protected boolean percussion = false; protected String name = ""; - protected List parts - = new ArrayList(); + protected List parts = new ArrayList<>(); public SimpleInstrument() { super(null, null, null, null); @@ -121,6 +122,7 @@ public class SimpleInstrument extends ModelInstrument { add(ins.getPerformers()); } + @Override public ModelPerformer[] getPerformers() { int percount = 0; @@ -166,10 +168,12 @@ public class SimpleInstrument extends ModelInstrument { return performers; } + @Override public Object getData() { return null; } + @Override public String getName() { return this.name; } @@ -178,6 +182,7 @@ public class SimpleInstrument extends ModelInstrument { this.name = name; } + @Override public ModelPatch getPatch() { return new ModelPatch(bank, preset, percussion); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java index d922633bc10..fab639cde3b 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SimpleSoundbank.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -44,21 +45,25 @@ public class SimpleSoundbank implements Soundbank { String version = ""; String vendor = ""; String description = ""; - List resources = new ArrayList(); - List instruments = new ArrayList(); + List resources = new ArrayList<>(); + List instruments = new ArrayList<>(); + @Override public String getName() { return name; } + @Override public String getVersion() { return version; } + @Override public String getVendor() { return vendor; } + @Override public String getDescription() { return description; } @@ -79,10 +84,12 @@ public class SimpleSoundbank implements Soundbank { this.version = version; } + @Override public SoundbankResource[] getResources() { return resources.toArray(new SoundbankResource[resources.size()]); } + @Override public Instrument[] getInstruments() { Instrument[] inslist_array = instruments.toArray(new Instrument[resources.size()]); @@ -90,6 +97,7 @@ public class SimpleSoundbank implements Soundbank { return inslist_array; } + @Override public Instrument getInstrument(Patch patch) { int program = patch.getProgram(); int bank = patch.getBank(); @@ -120,7 +128,7 @@ public class SimpleSoundbank implements Soundbank { public void removeResource(SoundbankResource resource) { if (resource instanceof Instrument) - instruments.remove((Instrument) resource); + instruments.remove(resource); else resources.remove(resource); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java index 45c83553457..ef9eac6dd03 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAbstractResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -74,14 +75,17 @@ public abstract class SoftAbstractResampler implements SoftResampler { ibuffer_order = true; } + @Override public void noteOn(MidiChannel channel, VoiceStatus voice, - int noteNumber, int velocity) { + int noteNumber, int velocity) { } + @Override public void noteOff(int velocity) { noteOff_flag = true; } + @Override public void open(ModelWavetable osc, float outputsamplerate) throws IOException { @@ -135,6 +139,7 @@ public abstract class SoftAbstractResampler implements SoftResampler { nextBuffer(); } + @Override public void setPitch(float pitch) { /* this.pitch = (float) Math.pow(2f, @@ -254,6 +259,7 @@ public abstract class SoftAbstractResampler implements SoftResampler { } } + @Override public int read(float[][] buffer, int offset, int len) throws IOException { @@ -373,6 +379,7 @@ public abstract class SoftAbstractResampler implements SoftResampler { return len; } + @Override public void close() throws IOException { stream.close(); } @@ -384,6 +391,7 @@ public abstract class SoftAbstractResampler implements SoftResampler { float in_end, float[] pitch, float pitchstep, float[] out, int[] out_offset, int out_end); + @Override public final SoftResamplerStreamer openStreamer() { return new ModelAbstractResamplerStream(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java index 45b2d0f1d9c..5e8e7e1b8fa 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioBuffer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; @@ -123,6 +124,5 @@ public final class SoftAudioBuffer { } } } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java index 6b6fdde9caf..4a10b03efed 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioProcessor.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,18 +32,17 @@ package com.sun.media.sound; */ public interface SoftAudioProcessor { - public void globalParameterControlChange(int[] slothpath, long param, - long value); + void globalParameterControlChange(int[] slothpath, long param, long value); - public void init(float samplerate, float controlrate); + void init(float samplerate, float controlrate); - public void setInput(int pin, SoftAudioBuffer input); + void setInput(int pin, SoftAudioBuffer input); - public void setOutput(int pin, SoftAudioBuffer output); + void setOutput(int pin, SoftAudioBuffer output); - public void setMixMode(boolean mix); + void setMixMode(boolean mix); - public void processAudio(); + void processAudio(); - public void processControlLogic(); + void processControlLogic(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java index 3a5e6d9dc1b..4f9c9f21c5c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftAudioPusher.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -70,6 +71,7 @@ public final class SoftAudioPusher implements Runnable { } } + @Override public void run() { byte[] buffer = SoftAudioPusher.this.buffer; AudioInputStream ais = SoftAudioPusher.this.ais; @@ -87,6 +89,5 @@ public final class SoftAudioPusher implements Runnable { active = false; //e.printStackTrace(); } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java index 667b9cc3741..4f7fad6bacc 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannel.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -41,7 +42,7 @@ import javax.sound.midi.Patch; */ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { - private static boolean[] dontResetControls = new boolean[128]; + private static final boolean[] dontResetControls = new boolean[128]; static { for (int i = 0; i < dontResetControls.length; i++) dontResetControls[i] = false; @@ -99,18 +100,18 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { private boolean solo = false; private boolean solomute = false; private final Object control_mutex; - private int channel; - private SoftVoice[] voices; + private final int channel; + private final SoftVoice[] voices; private int bank; private int program; - private SoftSynthesizer synthesizer; - private SoftMainMixer mainmixer; - private int[] polypressure = new int[128]; + private final SoftSynthesizer synthesizer; + private final SoftMainMixer mainmixer; + private final int[] polypressure = new int[128]; private int channelpressure = 0; - private int[] controller = new int[128]; + private final int[] controller = new int[128]; private int pitchbend; - private double[] co_midi_pitch = new double[1]; - private double[] co_midi_channel_pressure = new double[1]; + private final double[] co_midi_pitch = new double[1]; + private final double[] co_midi_channel_pressure = new double[1]; SoftTuning tuning = new SoftTuning(); int tuning_bank = 0; int tuning_program = 0; @@ -132,6 +133,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { double[] channel_pressure = co_midi_channel_pressure; double[] poly_pressure = new double[1]; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -145,26 +147,28 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } - private SoftControl[] co_midi = new SoftControl[128]; + private final SoftControl[] co_midi = new SoftControl[128]; { for (int i = 0; i < co_midi.length; i++) { co_midi[i] = new MidiControlObject(); } } - private double[][] co_midi_cc_cc = new double[128][1]; - private SoftControl co_midi_cc = new SoftControl() { + private final double[][] co_midi_cc_cc = new double[128][1]; + private final SoftControl co_midi_cc = new SoftControl() { double[][] cc = co_midi_cc_cc; + @Override public double[] get(int instance, String name) { if (name == null) return null; return cc[Integer.parseInt(name)]; } }; - Map co_midi_rpn_rpn_i = new HashMap(); - Map co_midi_rpn_rpn = new HashMap(); - private SoftControl co_midi_rpn = new SoftControl() { + Map co_midi_rpn_rpn_i = new HashMap<>(); + Map co_midi_rpn_rpn = new HashMap<>(); + private final SoftControl co_midi_rpn = new SoftControl() { Map rpn = co_midi_rpn_rpn; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -177,10 +181,11 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { return v; } }; - Map co_midi_nrpn_nrpn_i = new HashMap(); - Map co_midi_nrpn_nrpn = new HashMap(); - private SoftControl co_midi_nrpn = new SoftControl() { + Map co_midi_nrpn_nrpn_i = new HashMap<>(); + Map co_midi_nrpn_nrpn = new HashMap<>(); + private final SoftControl co_midi_nrpn = new SoftControl() { Map nrpn = co_midi_nrpn_nrpn; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -407,6 +412,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public void noteOn(int noteNumber, int velocity) { noteOn(noteNumber, velocity, 0); } @@ -544,6 +550,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public void noteOff(int noteNumber, int velocity) { noteNumber = restrict7Bit(noteNumber); velocity = restrict7Bit(velocity); @@ -616,7 +623,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } - private int[] lastVelocity = new int[128]; + private final int[] lastVelocity = new int[128]; private int prevVoiceID; private boolean firstVoice = true; private int voiceNo = 0; @@ -625,6 +632,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { private int play_delay = 0; private boolean play_releasetriggered = false; + @Override public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) { int noteNumber = play_noteNumber; @@ -657,11 +665,13 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { connectionBlocks, current_mixer, releasetriggered); } + @Override public void noteOff(int noteNumber) { if(noteNumber < 0 || noteNumber > 127) return; noteOff_internal(noteNumber, 64); } + @Override public void setPolyPressure(int noteNumber, int pressure) { noteNumber = restrict7Bit(noteNumber); pressure = restrict7Bit(pressure); @@ -680,12 +690,14 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public int getPolyPressure(int noteNumber) { synchronized (control_mutex) { return polypressure[noteNumber]; } } + @Override public void setChannelPressure(int pressure) { pressure = restrict7Bit(pressure); if (current_mixer != null) @@ -701,6 +713,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public int getChannelPressure() { synchronized (control_mutex) { return channelpressure; @@ -823,7 +836,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { 05 LFO Amplitude Depth | 00H..7FH | 0..100 percent | 0 */ - List conns = new ArrayList(); + List conns = new ArrayList<>(); for (int i = 0; i < destination.length; i++) { int d = destination[i]; @@ -869,6 +882,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { final double scale = (r / 64.0); ModelTransform mt = new ModelTransform() { double s = scale; + @Override public double transform(double value) { if (s < 1) value = s + (value * (1.0 - s)); @@ -923,6 +937,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { ModelTransform mt = new ModelTransform() { double s = scale; + @Override public double transform(double value) { return -((5.0 / 12.0) / Math.log(10)) * Math.log(1 - value * s); @@ -1055,6 +1070,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { return (int)(keybasedcontroller_value[noteNumber][controller] * 128); } + @Override public void controlChange(int controller, int value) { controller = restrict7Bit(controller); value = restrict7Bit(value); @@ -1241,6 +1257,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public int getController(int controller) { synchronized (control_mutex) { // Should only return lower 7 bits, @@ -1259,10 +1276,12 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public void programChange(int program) { programChange(bank, program); } + @Override public void programChange(int bank, int program) { bank = restrict14Bit(bank); program = restrict7Bit(program); @@ -1277,12 +1296,14 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public int getProgram() { synchronized (control_mutex) { return program; } } + @Override public void setPitchBend(int bend) { bend = restrict14Bit(bend); if (current_mixer != null) @@ -1297,6 +1318,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public int getPitchBend() { synchronized (control_mutex) { return pitchbend; @@ -1398,6 +1420,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { voices[i].rpnChange(controller, val_i[0]); } + @Override public void resetAllControllers() { resetAllControllers(false); } @@ -1463,6 +1486,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public void allNotesOff() { if (current_mixer != null) current_mixer.allNotesOff(); @@ -1475,6 +1499,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public void allSoundOff() { if (current_mixer != null) current_mixer.allSoundOff(); @@ -1485,10 +1510,12 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public boolean localControl(boolean on) { return false; } + @Override public void setMono(boolean on) { if (current_mixer != null) current_mixer.setMono(on); @@ -1498,12 +1525,14 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public boolean getMono() { synchronized (control_mutex) { return mono; } } + @Override public void setOmni(boolean on) { if (current_mixer != null) current_mixer.setOmni(on); @@ -1511,10 +1540,12 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { // Omni is not supported by GM2 } + @Override public boolean getOmni() { return false; } + @Override public void setMute(boolean mute) { if (current_mixer != null) current_mixer.setMute(mute); @@ -1526,12 +1557,14 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public boolean getMute() { synchronized (control_mutex) { return mute; } } + @Override public void setSolo(boolean soloState) { if (current_mixer != null) current_mixer.setSolo(soloState); @@ -1571,6 +1604,7 @@ public final class SoftChannel implements MidiChannel, ModelDirectedPlayer { } } + @Override public boolean getSolo() { synchronized (control_mutex) { return solo; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java index d5d8726fee9..ddadffb9766 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChannelProxy.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.MidiChannel; @@ -44,156 +45,182 @@ public final class SoftChannelProxy implements MidiChannel { this.channel = channel; } + @Override public void allNotesOff() { if (channel == null) return; channel.allNotesOff(); } + @Override public void allSoundOff() { if (channel == null) return; channel.allSoundOff(); } + @Override public void controlChange(int controller, int value) { if (channel == null) return; channel.controlChange(controller, value); } + @Override public int getChannelPressure() { if (channel == null) return 0; return channel.getChannelPressure(); } + @Override public int getController(int controller) { if (channel == null) return 0; return channel.getController(controller); } + @Override public boolean getMono() { if (channel == null) return false; return channel.getMono(); } + @Override public boolean getMute() { if (channel == null) return false; return channel.getMute(); } + @Override public boolean getOmni() { if (channel == null) return false; return channel.getOmni(); } + @Override public int getPitchBend() { if (channel == null) return 8192; return channel.getPitchBend(); } + @Override public int getPolyPressure(int noteNumber) { if (channel == null) return 0; return channel.getPolyPressure(noteNumber); } + @Override public int getProgram() { if (channel == null) return 0; return channel.getProgram(); } + @Override public boolean getSolo() { if (channel == null) return false; return channel.getSolo(); } + @Override public boolean localControl(boolean on) { if (channel == null) return false; return channel.localControl(on); } + @Override public void noteOff(int noteNumber) { if (channel == null) return; channel.noteOff(noteNumber); } + @Override public void noteOff(int noteNumber, int velocity) { if (channel == null) return; channel.noteOff(noteNumber, velocity); } + @Override public void noteOn(int noteNumber, int velocity) { if (channel == null) return; channel.noteOn(noteNumber, velocity); } + @Override public void programChange(int program) { if (channel == null) return; channel.programChange(program); } + @Override public void programChange(int bank, int program) { if (channel == null) return; channel.programChange(bank, program); } + @Override public void resetAllControllers() { if (channel == null) return; channel.resetAllControllers(); } + @Override public void setChannelPressure(int pressure) { if (channel == null) return; channel.setChannelPressure(pressure); } + @Override public void setMono(boolean on) { if (channel == null) return; channel.setMono(on); } + @Override public void setMute(boolean mute) { if (channel == null) return; channel.setMute(mute); } + @Override public void setOmni(boolean on) { if (channel == null) return; channel.setOmni(on); } + @Override public void setPitchBend(int bend) { if (channel == null) return; channel.setPitchBend(bend); } + @Override public void setPolyPressure(int noteNumber, int pressure) { if (channel == null) return; channel.setPolyPressure(noteNumber, pressure); } + @Override public void setSolo(boolean soloState) { if (channel == null) return; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java index 81b0e8209c7..ff78bea9c65 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftChorus.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; @@ -190,6 +191,7 @@ public final class SoftChorus implements SoftAudioProcessor { private float dirty_vdelay1R_reverbsendgain; private float controlrate; + @Override public void init(float samplerate, float controlrate) { this.controlrate = controlrate; vdelay1L = new LFODelay(samplerate, controlrate); @@ -202,8 +204,9 @@ public final class SoftChorus implements SoftAudioProcessor { globalParameterControlChange(new int[]{0x01 * 128 + 0x02}, 0, 2); } + @Override public void globalParameterControlChange(int[] slothpath, long param, - long value) { + long value) { if (slothpath.length == 1) { if (slothpath[0] == 0x01 * 128 + 0x02) { if (param == 0) { // Chorus Type @@ -271,6 +274,7 @@ public final class SoftChorus implements SoftAudioProcessor { } } + @Override public void processControlLogic() { if (dirty) { dirty = false; @@ -286,6 +290,7 @@ public final class SoftChorus implements SoftAudioProcessor { } double silentcounter = 1000; + @Override public void processAudio() { if (inputA.isSilent()) { @@ -317,15 +322,18 @@ public final class SoftChorus implements SoftAudioProcessor { } } + @Override public void setInput(int pin, SoftAudioBuffer input) { if (pin == 0) inputA = input; } + @Override public void setMixMode(boolean mix) { this.mix = mix; } + @Override public void setOutput(int pin, SoftAudioBuffer output) { if (pin == 0) left = output; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java index e36295742c8..7f376c9e790 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftControl.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -32,5 +33,5 @@ package com.sun.media.sound; */ public interface SoftControl { - public double[] get(int instance, String name); + double[] get(int instance, String name); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java index 4eeb817fc3d..e7fe033429f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftCubicResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,13 +32,15 @@ package com.sun.media.sound; */ public final class SoftCubicResampler extends SoftAbstractResampler { + @Override public int getPadding() { return 3; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; int ox = out_offset[0]; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java index cf4d2894431..e2e2df6499a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -61,6 +62,7 @@ public final class SoftEnvelopeGenerator implements SoftProcess { private final double[][] decay2 = new double[max_count][1]; private double control_time = 0; + @Override public void reset() { for (int i = 0; i < used_count; i++) { stage[i] = 0; @@ -80,11 +82,13 @@ public final class SoftEnvelopeGenerator implements SoftProcess { used_count = 0; } + @Override public void init(SoftSynthesizer synth) { control_time = 1.0 / synth.getControlRate(); processControlLogic(); } + @Override public double[] get(int instance, String name) { if (instance >= used_count) used_count = instance + 1; @@ -118,6 +122,7 @@ public final class SoftEnvelopeGenerator implements SoftProcess { return null; } + @Override @SuppressWarnings("fallthrough") public void processControlLogic() { for (int i = 0; i < used_count; i++) { @@ -295,6 +300,5 @@ public final class SoftEnvelopeGenerator implements SoftProcess { break; } } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java index 98b4c7af9df..ecfb3654972 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftFilter.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java index 009867ca09b..b838ce6bcfb 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftInstrument.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.Instrument; @@ -72,6 +73,7 @@ public final class SoftInstrument extends Instrument { return ins; } + @Override public Object getData() { return data; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java index 61cdf7cdf25..075d2a78ef1 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftJitterCorrector.java @@ -22,14 +22,16 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + /** * A jitter corrector to be used with SoftAudioPusher. * @@ -124,6 +126,7 @@ public final class SoftJitterCorrector extends AudioInputStream { Runnable runnable = new Runnable() { + @Override public void run() { AudioFormat format = stream.getFormat(); int bufflen = buffers[0].length; @@ -220,6 +223,7 @@ public final class SoftJitterCorrector extends AudioInputStream { thread.start(); } + @Override public void close() throws IOException { synchronized (this) { active = false; @@ -232,6 +236,7 @@ public final class SoftJitterCorrector extends AudioInputStream { stream.close(); } + @Override public int read() throws IOException { byte[] b = new byte[1]; if (read(b) == -1) @@ -244,6 +249,7 @@ public final class SoftJitterCorrector extends AudioInputStream { bbuffer_pos = 0; } + @Override public int read(byte[] b, int off, int len) { if (bbuffer == null) fillBuffer(); @@ -263,6 +269,7 @@ public final class SoftJitterCorrector extends AudioInputStream { return len; } + @Override public int available() { return bbuffer.length - bbuffer_pos; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java index 1d2d3619698..0d727da242d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLanczosResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -69,14 +70,16 @@ public final class SoftLanczosResampler extends SoftAbstractResampler { return w; } + @Override public int getPadding() // must be at least half of sinc_table_size { return sinc_table_size / 2 + 2; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; int ox = out_offset[0]; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java index 7c74a18e1c0..cca58814278 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLimiter.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -43,10 +44,12 @@ public final class SoftLimiter implements SoftAudioProcessor { SoftAudioBuffer bufferRout; float controlrate; + @Override public void init(float samplerate, float controlrate) { this.controlrate = controlrate; } + @Override public void setInput(int pin, SoftAudioBuffer input) { if (pin == 0) bufferL = input; @@ -54,6 +57,7 @@ public final class SoftLimiter implements SoftAudioProcessor { bufferR = input; } + @Override public void setOutput(int pin, SoftAudioBuffer output) { if (pin == 0) bufferLout = output; @@ -61,16 +65,19 @@ public final class SoftLimiter implements SoftAudioProcessor { bufferRout = output; } + @Override public void setMixMode(boolean mix) { this.mix = mix; } + @Override public void globalParameterControlChange(int[] slothpath, long param, - long value) { + long value) { } double silentcounter = 0; + @Override public void processAudio() { if (this.bufferL.isSilent() && (this.bufferR == null || this.bufferR.isSilent())) { @@ -186,6 +193,7 @@ public final class SoftLimiter implements SoftAudioProcessor { gain = newgain; } + @Override public void processControlLogic() { } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java index eb2b98d3772..21aa62adbfe 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,13 +32,15 @@ package com.sun.media.sound; */ public final class SoftLinearResampler extends SoftAbstractResampler { + @Override public int getPadding() { return 2; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; @@ -65,6 +68,5 @@ public final class SoftLinearResampler extends SoftAbstractResampler { in_offset[0] = ix; out_offset[0] = ox; startpitch[0] = pitch; - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java index 67f1b6b2c32..9f5f1197c55 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLinearResampler2.java @@ -33,13 +33,15 @@ package com.sun.media.sound; */ public final class SoftLinearResampler2 extends SoftAbstractResampler { + @Override public int getPadding() { return 2; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java index a0a8bbe1697..bba31e19999 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -52,6 +53,7 @@ public final class SoftLowFrequencyOscillator implements SoftProcess { } } + @Override public void reset() { for (int i = 0; i < used_count; i++) { out[i][0] = 0; @@ -67,6 +69,7 @@ public final class SoftLowFrequencyOscillator implements SoftProcess { used_count = 0; } + @Override public void init(SoftSynthesizer synth) { control_time = 1.0 / synth.getControlRate(); sin_factor = control_time * 2 * Math.PI; @@ -78,6 +81,7 @@ public final class SoftLowFrequencyOscillator implements SoftProcess { processControlLogic(); } + @Override public void processControlLogic() { for (int i = 0; i < used_count; i++) { if (delay_counter[i] > 0) { @@ -114,6 +118,7 @@ public final class SoftLowFrequencyOscillator implements SoftProcess { } } + @Override public double[] get(int instance, String name) { if (instance >= used_count) used_count = instance + 1; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java index d3f8713180c..9661fa39367 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMainMixer.java @@ -22,15 +22,16 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; import java.io.InputStream; import java.util.HashSet; import java.util.Iterator; +import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; -import java.util.Map.Entry; import javax.sound.midi.MidiMessage; import javax.sound.midi.Patch; @@ -74,26 +75,26 @@ public final class SoftMainMixer { private long sample_pos = 0; boolean readfully = true; private final Object control_mutex; - private SoftSynthesizer synth; + private final SoftSynthesizer synth; private float samplerate = 44100; private int nrofchannels = 2; private SoftVoice[] voicestatus = null; - private SoftAudioBuffer[] buffers; - private SoftReverb reverb; - private SoftAudioProcessor chorus; - private SoftAudioProcessor agc; + private final SoftAudioBuffer[] buffers; + private final SoftReverb reverb; + private final SoftAudioProcessor chorus; + private final SoftAudioProcessor agc; private long msec_buffer_len = 0; private int buffer_len = 0; - TreeMap midimessages = new TreeMap(); + TreeMap midimessages = new TreeMap<>(); private int delay_midievent = 0; private int max_delay_midievent = 0; double last_volume_left = 1.0; double last_volume_right = 1.0; - private double[] co_master_balance = new double[1]; - private double[] co_master_volume = new double[1]; - private double[] co_master_coarse_tuning = new double[1]; - private double[] co_master_fine_tuning = new double[1]; - private AudioInputStream ais; + private final double[] co_master_balance = new double[1]; + private final double[] co_master_volume = new double[1]; + private final double[] co_master_coarse_tuning = new double[1]; + private final double[] co_master_fine_tuning = new double[1]; + private final AudioInputStream ais; private Set registeredMixers = null; private Set stoppedMixers = null; private SoftChannelMixerContainer[] cur_registeredMixers = null; @@ -104,6 +105,7 @@ public final class SoftMainMixer { double[] coarse_tuning = co_master_coarse_tuning; double[] fine_tuning = co_master_fine_tuning; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -777,13 +779,13 @@ public final class SoftMainMixer { public void stopMixer(ModelChannelMixer mixer) { if (stoppedMixers == null) - stoppedMixers = new HashSet(); + stoppedMixers = new HashSet<>(); stoppedMixers.add(mixer); } public void registerMixer(ModelChannelMixer mixer) { if (registeredMixers == null) - registeredMixers = new HashSet(); + registeredMixers = new HashSet<>(); SoftChannelMixerContainer mixercontainer = new SoftChannelMixerContainer(); mixercontainer.buffers = new SoftAudioBuffer[6]; for (int i = 0; i < mixercontainer.buffers.length; i++) { @@ -883,6 +885,7 @@ public final class SoftMainMixer { bbuffer_pos = 0; } + @Override public int read(byte[] b, int off, int len) { int bbuffer_len = bbuffer.length; int offlen = off + len; @@ -903,6 +906,7 @@ public final class SoftMainMixer { return len; } + @Override public int read() throws IOException { int ret = read(single); if (ret == -1) @@ -910,10 +914,12 @@ public final class SoftMainMixer { return single[0] & 0xFF; } + @Override public int available() { return bbuffer.length - bbuffer_pos; } + @Override public void close() { SoftMainMixer.this.synth.close(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java index b573b16d935..2ac05a3ed57 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java @@ -63,7 +63,7 @@ public final class SoftMidiAudioFileReader extends SunFileReader { private AudioInputStream getAudioInputStream(final Sequence seq) throws InvalidMidiDataException { - AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer(); + AudioSynthesizer synth = new SoftSynthesizer(); AudioInputStream stream; Receiver recv; try { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java index 748b0eb3e1a..af3577493fe 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingClip.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.ByteArrayOutputStream; @@ -52,6 +53,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { private final InputStream datastream = new InputStream() { + @Override public int read() throws IOException { byte[] b = new byte[1]; int ret = read(b); @@ -60,6 +62,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { return b[0] & 0xFF; } + @Override public int read(byte[] b, int off, int len) throws IOException { if (_loopcount != 0) { @@ -166,6 +169,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { super(mixer, info); } + @Override protected void processControlLogic() { _rightgain = rightgain; @@ -203,6 +207,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } + @Override protected void processAudioLogic(SoftAudioBuffer[] buffers) { if (_active) { float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); @@ -273,15 +278,18 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } } + @Override public int getFrameLength() { return bufferSize / format.getFrameSize(); } + @Override public long getMicrosecondLength() { return (long) (getFrameLength() * (1000000.0 / (double) getFormat() .getSampleRate())); } + @Override public void loop(int count) { LineEvent event = null; @@ -302,8 +310,9 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } + @Override public void open(AudioInputStream stream) throws LineUnavailableException, - IOException { + IOException { if (isOpen()) { throw new IllegalStateException("Clip is already open with format " + getFormat() + " and frame lengh of " + getFrameLength()); @@ -342,6 +351,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } + @Override public void open(AudioFormat format, byte[] data, int offset, int bufferSize) throws LineUnavailableException { synchronized (control_mutex) { @@ -385,6 +395,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } + @Override public void setFramePosition(int frames) { synchronized (control_mutex) { frameposition_sg = true; @@ -392,6 +403,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } } + @Override public void setLoopPoints(int start, int end) { synchronized (control_mutex) { if (end != -1) { @@ -414,60 +426,73 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } } + @Override public void setMicrosecondPosition(long microseconds) { setFramePosition((int) (microseconds * (((double) getFormat() .getSampleRate()) / 1000000.0))); } + @Override public int available() { return 0; } + @Override public void drain() { } + @Override public void flush() { } + @Override public int getBufferSize() { return bufferSize; } + @Override public AudioFormat getFormat() { return format; } + @Override public int getFramePosition() { synchronized (control_mutex) { return frameposition; } } + @Override public float getLevel() { return AudioSystem.NOT_SPECIFIED; } + @Override public long getLongFramePosition() { return getFramePosition(); } + @Override public long getMicrosecondPosition() { return (long) (getFramePosition() * (1000000.0 / (double) getFormat() .getSampleRate())); } + @Override public boolean isActive() { synchronized (control_mutex) { return active; } } + @Override public boolean isRunning() { synchronized (control_mutex) { return active; } } + @Override public void start() { LineEvent event = null; @@ -488,6 +513,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { sendEvent(event); } + @Override public void stop() { LineEvent event = null; @@ -506,6 +532,7 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { sendEvent(event); } + @Override public void close() { LineEvent event = null; @@ -526,10 +553,12 @@ public final class SoftMixingClip extends SoftMixingDataLine implements Clip { } + @Override public boolean isOpen() { return open; } + @Override public void open() throws LineUnavailableException { if (data == null) { throw new IllegalArgumentException( diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java index b7793062764..99962841c8f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingDataLine.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -33,11 +34,11 @@ import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.BooleanControl; import javax.sound.sampled.Control; +import javax.sound.sampled.Control.Type; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; -import javax.sound.sampled.Control.Type; /** * General software mixing line. @@ -130,22 +131,27 @@ public abstract class SoftMixingDataLine implements DataLine { ibuffer_len = buffer_len; } + @Override public int available() throws IOException { return 0; } + @Override public void close() throws IOException { ais.close(); } + @Override public AudioFormat getFormat() { return targetFormat; } + @Override public long getFrameLength() { return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength(); } + @Override public void mark(int readlimit) { ais.mark((int) (readlimit * pitch[0])); mark_ibuffer_index = ibuffer_index; @@ -162,6 +168,7 @@ public abstract class SoftMixingDataLine implements DataLine { } } + @Override public boolean markSupported() { return ais.markSupported(); } @@ -206,6 +213,7 @@ public abstract class SoftMixingDataLine implements DataLine { } + @Override public int read(float[] b, int off, int len) throws IOException { if (cbuffer == null || cbuffer[0].length < len / nrofchannels) { @@ -255,6 +263,7 @@ public abstract class SoftMixingDataLine implements DataLine { return len - remain * nrofchannels; } + @Override public void reset() throws IOException { ais.reset(); if (mark_ibuffer == null) @@ -271,6 +280,7 @@ public abstract class SoftMixingDataLine implements DataLine { } + @Override public long skip(long len) throws IOException { if (len > 0) return 0; @@ -302,6 +312,7 @@ public abstract class SoftMixingDataLine implements DataLine { -1, 0.0f, "dB", "Minimum", "", "Maximum"); } + @Override public void setValue(float newValue) { super.setValue(newValue); calcVolume(); @@ -314,6 +325,7 @@ public abstract class SoftMixingDataLine implements DataLine { super(BooleanControl.Type.MUTE, false, "True", "False"); } + @Override public void setValue(boolean newValue) { super.setValue(newValue); calcVolume(); @@ -326,6 +338,7 @@ public abstract class SoftMixingDataLine implements DataLine { super(BooleanControl.Type.APPLY_REVERB, false, "True", "False"); } + @Override public void setValue(boolean newValue) { super.setValue(newValue); calcVolume(); @@ -340,6 +353,7 @@ public abstract class SoftMixingDataLine implements DataLine { 0.0f, "", "Left", "Center", "Right"); } + @Override public void setValue(float newValue) { super.setValue(newValue); calcVolume(); @@ -354,11 +368,13 @@ public abstract class SoftMixingDataLine implements DataLine { 0.0f, "", "Left", "Center", "Right"); } + @Override public void setValue(float newValue) { super.setValue(newValue); balance_control.setValue(newValue); } + @Override public float getValue() { return balance_control.getValue(); } @@ -372,6 +388,7 @@ public abstract class SoftMixingDataLine implements DataLine { -1, -80f, "dB", "Minimum", "", "Maximum"); } + @Override public void setValue(float newValue) { super.setValue(newValue); balance_control.setValue(newValue); @@ -386,6 +403,7 @@ public abstract class SoftMixingDataLine implements DataLine { "Minimum", "", "Maximum"); } + @Override public void setValue(float newValue) { super.setValue(newValue); balance_control.setValue(newValue); @@ -417,7 +435,7 @@ public abstract class SoftMixingDataLine implements DataLine { float eff2gain = 0; - List listeners = new ArrayList(); + List listeners = new ArrayList<>(); final Object control_mutex; @@ -476,22 +494,26 @@ public abstract class SoftMixingDataLine implements DataLine { } } + @Override public final void addLineListener(LineListener listener) { synchronized (control_mutex) { listeners.add(listener); } } + @Override public final void removeLineListener(LineListener listener) { synchronized (control_mutex) { listeners.add(listener); } } + @Override public final javax.sound.sampled.Line.Info getLineInfo() { return info; } + @Override public final Control getControl(Type control) { if (control != null) { for (int i = 0; i < controls.length; i++) { @@ -504,10 +526,12 @@ public abstract class SoftMixingDataLine implements DataLine { + control); } + @Override public final Control[] getControls() { return Arrays.copyOf(controls, controls.length); } + @Override public final boolean isControlSupported(Type control) { if (control != null) { for (int i = 0; i < controls.length; i++) { @@ -518,5 +542,4 @@ public abstract class SoftMixingDataLine implements DataLine { } return false; } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java index c07bc59befa..6e91cf2995d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMainMixer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -79,7 +80,7 @@ public final class SoftMixingMainMixer { private final Object control_mutex; - private final List openLinesList = new ArrayList(); + private final List openLinesList = new ArrayList<>(); private SoftMixingDataLine[] openLines = new SoftMixingDataLine[0]; @@ -184,6 +185,7 @@ public final class SoftMixingMainMixer { bbuffer_pos = 0; } + @Override public int read(byte[] b, int off, int len) { int bbuffer_len = bbuffer.length; int offlen = off + len; @@ -200,6 +202,7 @@ public final class SoftMixingMainMixer { return len; } + @Override public int read() throws IOException { int ret = read(single); if (ret == -1) @@ -207,10 +210,12 @@ public final class SoftMixingMainMixer { return single[0] & 0xFF; } + @Override public int available() { return bbuffer.length - bbuffer_pos; } + @Override public void close() { SoftMixingMainMixer.this.mixer.close(); } @@ -239,14 +244,12 @@ public final class SoftMixingMainMixer { if (mixer.implicitOpen) mixer.close(); } - } public SoftMixingDataLine[] getOpenLines() { synchronized (control_mutex) { return openLines; } - } public void close() { @@ -255,5 +258,4 @@ public final class SoftMixingMainMixer { openLines[i].close(); } } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java index 9df5641ab13..a0d824e18f6 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -29,10 +30,12 @@ import java.util.ArrayList; import java.util.List; import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioFormat.Encoding; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.Control; +import javax.sound.sampled.Control.Type; import javax.sound.sampled.DataLine; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; @@ -40,11 +43,9 @@ import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Mixer; import javax.sound.sampled.SourceDataLine; -import javax.sound.sampled.AudioFormat.Encoding; -import javax.sound.sampled.Control.Type; /** - * Software audio mixer + * Software audio mixer. * * @author Karl Helgason */ @@ -88,7 +89,7 @@ public final class SoftMixingMixer implements Mixer { private final boolean jitter_correction = false; - private final List listeners = new ArrayList(); + private final List listeners = new ArrayList<>(); private final javax.sound.sampled.Line.Info[] sourceLineInfo; @@ -96,7 +97,7 @@ public final class SoftMixingMixer implements Mixer { sourceLineInfo = new javax.sound.sampled.Line.Info[2]; - ArrayList formats = new ArrayList(); + ArrayList formats = new ArrayList<>(); for (int channels = 1; channels <= 2; channels++) { formats.add(new AudioFormat(Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED, 8, channels, channels, @@ -140,6 +141,7 @@ public final class SoftMixingMixer implements Mixer { AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED); } + @Override public Line getLine(Line.Info info) throws LineUnavailableException { if (!isLineSupported(info)) @@ -155,6 +157,7 @@ public final class SoftMixingMixer implements Mixer { throw new IllegalArgumentException("Line unsupported: " + info); } + @Override public int getMaxLines(Line.Info info) { if (info.getLineClass() == SourceDataLine.class) return AudioSystem.NOT_SPECIFIED; @@ -163,10 +166,12 @@ public final class SoftMixingMixer implements Mixer { return 0; } + @Override public javax.sound.sampled.Mixer.Info getMixerInfo() { return info; } + @Override public javax.sound.sampled.Line.Info[] getSourceLineInfo() { Line.Info[] localArray = new Line.Info[sourceLineInfo.length]; System.arraycopy(sourceLineInfo, 0, localArray, 0, @@ -174,10 +179,11 @@ public final class SoftMixingMixer implements Mixer { return localArray; } + @Override public javax.sound.sampled.Line.Info[] getSourceLineInfo( javax.sound.sampled.Line.Info info) { int i; - ArrayList infos = new ArrayList(); + ArrayList infos = new ArrayList<>(); for (i = 0; i < sourceLineInfo.length; i++) { if (info.matches(sourceLineInfo[i])) { @@ -187,6 +193,7 @@ public final class SoftMixingMixer implements Mixer { return infos.toArray(new Line.Info[infos.size()]); } + @Override public Line[] getSourceLines() { Line[] localLines; @@ -207,19 +214,23 @@ public final class SoftMixingMixer implements Mixer { return localLines; } + @Override public javax.sound.sampled.Line.Info[] getTargetLineInfo() { return new javax.sound.sampled.Line.Info[0]; } + @Override public javax.sound.sampled.Line.Info[] getTargetLineInfo( javax.sound.sampled.Line.Info info) { return new javax.sound.sampled.Line.Info[0]; } + @Override public Line[] getTargetLines() { return new Line[0]; } + @Override public boolean isLineSupported(javax.sound.sampled.Line.Info info) { if (info != null) { for (int i = 0; i < sourceLineInfo.length; i++) { @@ -231,20 +242,24 @@ public final class SoftMixingMixer implements Mixer { return false; } + @Override public boolean isSynchronizationSupported(Line[] lines, boolean maintainSync) { return false; } + @Override public void synchronize(Line[] lines, boolean maintainSync) { throw new IllegalArgumentException( "Synchronization not supported by this mixer."); } + @Override public void unsynchronize(Line[] lines) { throw new IllegalArgumentException( "Synchronization not supported by this mixer."); } + @Override public void addLineListener(LineListener listener) { synchronized (control_mutex) { listeners.add(listener); @@ -261,6 +276,7 @@ public final class SoftMixingMixer implements Mixer { } } + @Override public void close() { if (!isOpen()) return; @@ -308,29 +324,35 @@ public final class SoftMixingMixer implements Mixer { } + @Override public Control getControl(Type control) { throw new IllegalArgumentException("Unsupported control type : " + control); } + @Override public Control[] getControls() { return new Control[0]; } + @Override public javax.sound.sampled.Line.Info getLineInfo() { return new Line.Info(Mixer.class); } + @Override public boolean isControlSupported(Type control) { return false; } + @Override public boolean isOpen() { synchronized (control_mutex) { return open; } } + @Override public void open() throws LineUnavailableException { if (isOpen()) { implicitOpen = false; @@ -498,6 +520,7 @@ public final class SoftMixingMixer implements Mixer { } + @Override public void removeLineListener(LineListener listener) { synchronized (control_mutex) { listeners.remove(listener); @@ -525,5 +548,4 @@ public final class SoftMixingMixer implements Mixer { return null; return mainmixer; } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java index 7b842f50495..d589bd8d470 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.sampled.Mixer; @@ -29,7 +30,7 @@ import javax.sound.sampled.Mixer.Info; import javax.sound.sampled.spi.MixerProvider; /** - * Provider for software audio mixer + * Provider for software audio mixer. * * @author Karl Helgason */ @@ -41,6 +42,7 @@ public final class SoftMixingMixerProvider extends MixerProvider { static final Object mutex = new Object(); + @Override public Mixer getMixer(Info info) { if (!(info == null || info == SoftMixingMixer.info)) { throw new IllegalArgumentException("Mixer " + info.toString() @@ -56,11 +58,10 @@ public final class SoftMixingMixerProvider extends MixerProvider { globalmixer = new SoftMixingMixer(); return globalmixer; } - } + @Override public Info[] getMixerInfo() { return new Info[] { SoftMixingMixer.info }; } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java index 962b4d2537b..1f1beb6411c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -76,30 +77,37 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine this.ais = ais; } + @Override public int available() throws IOException { return ais.available(); } + @Override public void close() throws IOException { ais.close(); } + @Override public AudioFormat getFormat() { return ais.getFormat(); } + @Override public long getFrameLength() { return ais.getFrameLength(); } + @Override public void mark(int readlimit) { ais.mark(readlimit); } + @Override public boolean markSupported() { return ais.markSupported(); } + @Override public int read(float[] b, int off, int len) throws IOException { int avail = available(); if (len > avail) { @@ -110,10 +118,12 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine return ais.read(b, off, len); } + @Override public void reset() throws IOException { ais.reset(); } + @Override public long skip(long len) throws IOException { return ais.skip(len); } @@ -124,6 +134,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine super(mixer, info); } + @Override public int write(byte[] b, int off, int len) { if (!isOpen()) return 0; @@ -202,6 +213,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine private float _eff2gain; + @Override protected void processControlLogic() { _active = active; _rightgain = rightgain; @@ -210,6 +222,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine _eff2gain = eff2gain; } + @Override protected void processAudioLogic(SoftAudioBuffer[] buffers) { if (_active) { float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); @@ -274,10 +287,12 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine } } + @Override public void open() throws LineUnavailableException { open(format); } + @Override public void open(AudioFormat format) throws LineUnavailableException { if (bufferSize == -1) bufferSize = ((int) (format.getFrameRate() / 2)) @@ -285,6 +300,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine open(format, bufferSize); } + @Override public void open(AudioFormat format, int bufferSize) throws LineUnavailableException { @@ -323,6 +339,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine InputStream cycling_inputstream = new InputStream() { + @Override public int read() throws IOException { byte[] b = new byte[1]; int ret = read(b); @@ -331,12 +348,14 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine return b[0] & 0xFF; } + @Override public int available() throws IOException { synchronized (cycling_buffer) { return cycling_avail; } } + @Override public int read(byte[] b, int off, int len) throws IOException { @@ -387,12 +406,14 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine } + @Override public int available() { synchronized (cycling_buffer) { return cycling_buffer.length - cycling_avail; } } + @Override public void drain() { while (true) { int avail; @@ -409,6 +430,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine } } + @Override public void flush() { synchronized (cycling_buffer) { cycling_read_pos = 0; @@ -417,49 +439,58 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine } } + @Override public int getBufferSize() { synchronized (control_mutex) { return bufferSize; } } + @Override public AudioFormat getFormat() { synchronized (control_mutex) { return format; } } + @Override public int getFramePosition() { return (int) getLongFramePosition(); } + @Override public float getLevel() { return AudioSystem.NOT_SPECIFIED; } + @Override public long getLongFramePosition() { synchronized (cycling_buffer) { return cycling_framepos; } } + @Override public long getMicrosecondPosition() { return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() .getSampleRate())); } + @Override public boolean isActive() { synchronized (control_mutex) { return active; } } + @Override public boolean isRunning() { synchronized (control_mutex) { return active; } } + @Override public void start() { LineEvent event = null; @@ -478,6 +509,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine sendEvent(event); } + @Override public void stop() { LineEvent event = null; @@ -495,6 +527,7 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine sendEvent(event); } + @Override public void close() { LineEvent event = null; @@ -516,10 +549,10 @@ public final class SoftMixingSourceDataLine extends SoftMixingDataLine } + @Override public boolean isOpen() { synchronized (control_mutex) { return open; } } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java index 5cd7c6eb92e..f9ab961e540 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPerformer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.ArrayList; @@ -92,6 +93,7 @@ public final class SoftPerformer { ModelStandardTransform.TRANSFORM_LINEAR), new ModelSource(new ModelIdentifier("midi_rpn", "0"), new ModelTransform() { + @Override public double transform(double value) { int v = (int) (value * 16384.0); int msb = v >> 7; @@ -309,21 +311,22 @@ public final class SoftPerformer { public ModelPerformer performer; public ModelConnectionBlock[] connections; public ModelOscillator[] oscillators; - public Map midi_rpn_connections = new HashMap(); - public Map midi_nrpn_connections = new HashMap(); + public Map midi_rpn_connections = new HashMap<>(); + public Map midi_nrpn_connections = new HashMap<>(); public int[][] midi_ctrl_connections; public int[][] midi_connections; public int[] ctrl_connections; - private List ctrl_connections_list = new ArrayList(); + private final List ctrl_connections_list = new ArrayList<>(); private static class KeySortComparator implements Comparator { + @Override public int compare(ModelSource o1, ModelSource o2) { return o1.getIdentifier().toString().compareTo( o2.getIdentifier().toString()); } } - private static KeySortComparator keySortComparator = new KeySortComparator(); + private static final KeySortComparator keySortComparator = new KeySortComparator(); private String extractKeys(ModelConnectionBlock conn) { StringBuilder sb = new StringBuilder(); @@ -474,9 +477,9 @@ public final class SoftPerformer { exclusiveClass = performer.getExclusiveClass(); selfNonExclusive = performer.isSelfNonExclusive(); - Map connmap = new HashMap(); + Map connmap = new HashMap<>(); - List performer_connections = new ArrayList(); + List performer_connections = new ArrayList<>(); performer_connections.addAll(performer.getConnectionBlocks()); if (performer.isDefaultConnectionsEnabled()) { @@ -649,6 +652,7 @@ public final class SoftPerformer { new ModelSource(new ModelIdentifier("midi_cc", "77"), new ModelTransform() { double s = scale; + @Override public double transform(double value) { value = value * 2 - 1; value *= 600; @@ -687,7 +691,7 @@ public final class SoftPerformer { connmap.put(extractKeys(connection), connection); // seperate connection blocks : Init time, Midi Time, Midi/Control Time, // Control Time - List connections = new ArrayList(); + List connections = new ArrayList<>(); midi_ctrl_connections = new int[128][]; for (int i = 0; i < midi_ctrl_connections.length; i++) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java index 4256eaba255..07b5e4f92e0 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftPointResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,13 +32,15 @@ package com.sun.media.sound; */ public final class SoftPointResampler extends SoftAbstractResampler { + @Override public int getPadding() { return 100; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; int ox = out_offset[0]; @@ -58,6 +61,5 @@ public final class SoftPointResampler extends SoftAbstractResampler { in_offset[0] = ix; out_offset[0] = ox; startpitch[0] = pitch; - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java index 1734af1e2c7..77fb6f6a56d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProcess.java @@ -22,20 +22,22 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** - * Control signal processor interface + * Control signal processor interface. * * @author Karl Helgason */ public interface SoftProcess extends SoftControl { - public void init(SoftSynthesizer synth); + void init(SoftSynthesizer synth); - public double[] get(int instance, String name); + @Override + double[] get(int instance, String name); - public void processControlLogic(); + void processControlLogic(); - public void reset(); + void reset(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java index 9a0d9c0e84a..5cf4dcaa496 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReceiver.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.TreeMap; @@ -52,10 +53,12 @@ public final class SoftReceiver implements MidiDeviceReceiver { this.midimessages = mainmixer.midimessages; } + @Override public MidiDevice getMidiDevice() { return synth; } + @Override public void send(MidiMessage message, long timeStamp) { synchronized (control_mutex) { @@ -80,6 +83,7 @@ public final class SoftReceiver implements MidiDeviceReceiver { } } + @Override public void close() { synchronized (control_mutex) { open = false; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java index 3aabefdca2d..9f56f580a7f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -31,5 +32,5 @@ package com.sun.media.sound; */ public interface SoftResampler { - public SoftResamplerStreamer openStreamer(); + SoftResamplerStreamer openStreamer(); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java index 28045ca07b4..b11c7294ca3 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftResamplerStreamer.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -33,6 +34,5 @@ import java.io.IOException; */ public interface SoftResamplerStreamer extends ModelOscillatorStream { - public void open(ModelWavetable osc, float outputsamplerate) - throws IOException; + void open(ModelWavetable osc, float outputsamplerate) throws IOException; } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java index 3876758ad96..8a1ce4ceaf9 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftReverb.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.util.Arrays; @@ -210,6 +211,7 @@ public final class SoftReverb implements SoftAudioProcessor { private float samplerate; private boolean light = true; + @Override public void init(float samplerate, float controlrate) { this.samplerate = samplerate; @@ -260,11 +262,13 @@ public final class SoftReverb implements SoftAudioProcessor { } + @Override public void setInput(int pin, SoftAudioBuffer input) { if (pin == 0) inputA = input; } + @Override public void setOutput(int pin, SoftAudioBuffer output) { if (pin == 0) left = output; @@ -272,12 +276,14 @@ public final class SoftReverb implements SoftAudioProcessor { right = output; } + @Override public void setMixMode(boolean mix) { this.mix = mix; } private boolean silent = true; + @Override public void processAudio() { boolean silent_input = this.inputA.isSilent(); if(!silent_input) @@ -330,7 +336,7 @@ public final class SoftReverb implements SoftAudioProcessor { for (int i = 4; i < combL.length-2; i+=2) combL[i].processMix(input, pre1); - combL[3].processReplace(input, pre2);; + combL[3].processReplace(input, pre2); for (int i = 5; i < combL.length-2; i+=2) combL[i].processMix(input, pre2); @@ -376,11 +382,6 @@ public final class SoftReverb implements SoftAudioProcessor { combL[i].processMix(out, left); } - - - - - if (silent_input) { silent = true; for (int i = 0; i < numsamples; i++) @@ -396,8 +397,9 @@ public final class SoftReverb implements SoftAudioProcessor { } + @Override public void globalParameterControlChange(int[] slothpath, long param, - long value) { + long value) { if (slothpath.length == 1) { if (slothpath[0] == 0x01 * 128 + 0x01) { @@ -463,6 +465,7 @@ public final class SoftReverb implements SoftAudioProcessor { } } + @Override public void processControlLogic() { if (dirty) { dirty = false; @@ -504,7 +507,6 @@ public final class SoftReverb implements SoftAudioProcessor { combL[i].setDamp(damp); combR[i].setDamp(damp); } - } public void setLightMode(boolean light) diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java index f2122601c69..1a1fa9e3467 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftShortMessage.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import javax.sound.midi.InvalidMidiDataException; @@ -36,16 +37,19 @@ public final class SoftShortMessage extends ShortMessage { int channel = 0; + @Override public int getChannel() { return channel; } + @Override public void setMessage(int command, int channel, int data1, int data2) throws InvalidMidiDataException { this.channel = channel; super.setMessage(command, channel & 0xF, data1, data2); } + @Override public Object clone() { SoftShortMessage clone = new SoftShortMessage(); try { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java index 051e44120e8..8cc75634c1b 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSincResampler.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; /** @@ -76,14 +77,16 @@ public final class SoftSincResampler extends SoftAbstractResampler { return w; } + @Override public int getPadding() // must be at least half of sinc_table_size { return sinc_table_size / 2 + 2; } + @Override public void interpolate(float[] in, float[] in_offset, float in_end, - float[] startpitch, float pitchstep, float[] out, int[] out_offset, - int out_end) { + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { float pitch = startpitch[0]; float ix = in_offset[0]; int ox = out_offset[0]; @@ -134,6 +137,5 @@ public final class SoftSincResampler extends SoftAbstractResampler { in_offset[0] = ix; out_offset[0] = ox; startpitch[0] = pitch; - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java index 41b0cffa3df..75c0c57467c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java @@ -78,16 +78,17 @@ public final class SoftSynthesizer implements AudioSynthesizer, public SourceDataLine sourceDataLine = null; public volatile long silent_samples = 0; private int framesize = 0; - private WeakReference weak_stream_link; - private AudioFloatConverter converter; + private final WeakReference weak_stream_link; + private final AudioFloatConverter converter; private float[] silentbuffer = null; - private int samplesize; + private final int samplesize; public void setInputStream(AudioInputStream stream) { this.stream = stream; } + @Override public int available() throws IOException { AudioInputStream local_stream = stream; if(local_stream != null) @@ -95,6 +96,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return 0; } + @Override public int read() throws IOException { byte[] b = new byte[1]; if (read(b) == -1) @@ -102,6 +104,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return b[0] & 0xFF; } + @Override public int read(byte[] b, int off, int len) throws IOException { AudioInputStream local_stream = stream; if(local_stream != null) @@ -123,6 +126,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, SoftAudioPusher _pusher = pusher; AudioInputStream _jitter_stream = jitter_stream; SourceDataLine _sourceDataLine = sourceDataLine; + @Override public void run() { _pusher.stop(); @@ -147,7 +151,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, public WeakAudioStream(AudioInputStream stream) { this.stream = stream; - weak_stream_link = new WeakReference(stream); + weak_stream_link = new WeakReference<>(stream); converter = AudioFloatConverter.getConverter(stream.getFormat()); samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels(); framesize = stream.getFormat().getFrameSize(); @@ -158,6 +162,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return new AudioInputStream(this, stream.getFormat(), AudioSystem.NOT_SPECIFIED); } + @Override public void close() throws IOException { AudioInputStream astream = weak_stream_link.get(); @@ -233,14 +238,10 @@ public final class SoftSynthesizer implements AudioSynthesizer, private SoftMainMixer mainmixer; private SoftVoice[] voices; - private Map tunings - = new HashMap(); - private Map inslist - = new HashMap(); - private Map loadedlist - = new HashMap(); - - private ArrayList recvslist = new ArrayList(); + private final Map tunings = new HashMap<>(); + private final Map inslist = new HashMap<>(); + private final Map loadedlist = new HashMap<>(); + private final ArrayList recvslist = new ArrayList<>(); private void getBuffers(ModelInstrument instrument, List buffers) { @@ -264,7 +265,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, private boolean loadSamples(List instruments) { if (largemode) return true; - List buffers = new ArrayList(); + List buffers = new ArrayList<>(); for (ModelInstrument instrument : instruments) getBuffers(instrument, buffers); try { @@ -485,24 +486,28 @@ public final class SoftSynthesizer implements AudioSynthesizer, return tuning; } + @Override public long getLatency() { synchronized (control_mutex) { return latency; } } + @Override public AudioFormat getFormat() { synchronized (control_mutex) { return format; } } + @Override public int getMaxPolyphony() { synchronized (control_mutex) { return maxpoly; } } + @Override public MidiChannel[] getChannels() { synchronized (control_mutex) { @@ -525,6 +530,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public VoiceStatus[] getVoiceStatus() { if (!isOpen()) { VoiceStatus[] tempVoiceStatusArray @@ -559,6 +565,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public boolean isSoundbankSupported(Soundbank soundbank) { for (Instrument ins: soundbank.getInstruments()) if (!(ins instanceof ModelInstrument)) @@ -566,16 +573,18 @@ public final class SoftSynthesizer implements AudioSynthesizer, return true; } + @Override public boolean loadInstrument(Instrument instrument) { if (instrument == null || (!(instrument instanceof ModelInstrument))) { throw new IllegalArgumentException("Unsupported instrument: " + instrument); } - List instruments = new ArrayList(); + List instruments = new ArrayList<>(); instruments.add((ModelInstrument)instrument); return loadInstruments(instruments); } + @Override public void unloadInstrument(Instrument instrument) { if (instrument == null || (!(instrument instanceof ModelInstrument))) { throw new IllegalArgumentException("Unsupported instrument: " + @@ -596,6 +605,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public boolean remapInstrument(Instrument from, Instrument to) { if (from == null) @@ -623,15 +633,16 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public Soundbank getDefaultSoundbank() { synchronized (SoftSynthesizer.class) { if (defaultSoundBank != null) return defaultSoundBank; - List> actions = - new ArrayList>(); + List> actions = new ArrayList<>(); actions.add(new PrivilegedAction() { + @Override public InputStream run() { File javahome = new File(System.getProperties() .getProperty("java.home")); @@ -667,6 +678,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, }); actions.add(new PrivilegedAction() { + @Override public InputStream run() { if (System.getProperties().getProperty("os.name") .startsWith("Linux")) { @@ -701,6 +713,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, }); actions.add(new PrivilegedAction() { + @Override public InputStream run() { if (System.getProperties().getProperty("os.name") .startsWith("Windows")) { @@ -718,6 +731,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, }); actions.add(new PrivilegedAction() { + @Override public InputStream run() { /* * Try to load saved generated soundbank @@ -798,6 +812,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return defaultSoundBank; } + @Override public Instrument[] getAvailableInstruments() { Soundbank defsbk = getDefaultSoundbank(); if (defsbk == null) @@ -807,6 +822,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return inslist_array; } + @Override public Instrument[] getLoadedInstruments() { if (!isOpen()) return new Instrument[0]; @@ -820,8 +836,9 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public boolean loadAllInstruments(Soundbank soundbank) { - List instruments = new ArrayList(); + List instruments = new ArrayList<>(); for (Instrument ins: soundbank.getInstruments()) { if (ins == null || !(ins instanceof ModelInstrument)) { throw new IllegalArgumentException( @@ -832,6 +849,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return loadInstruments(instruments); } + @Override public void unloadAllInstruments(Soundbank soundbank) { if (soundbank == null || !isSoundbankSupported(soundbank)) throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); @@ -846,8 +864,9 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public boolean loadInstruments(Soundbank soundbank, Patch[] patchList) { - List instruments = new ArrayList(); + List instruments = new ArrayList<>(); for (Patch patch: patchList) { Instrument ins = soundbank.getInstrument(patch); if (ins == null || !(ins instanceof ModelInstrument)) { @@ -859,6 +878,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return loadInstruments(instruments); } + @Override public void unloadInstruments(Soundbank soundbank, Patch[] patchList) { if (soundbank == null || !isSoundbankSupported(soundbank)) throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); @@ -874,6 +894,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public MidiDevice.Info getDeviceInfo() { return info; } @@ -901,9 +922,9 @@ public final class SoftSynthesizer implements AudioSynthesizer, }); } + @Override public AudioSynthesizerPropertyInfo[] getPropertyInfo(Map info) { - List list = - new ArrayList(); + List list = new ArrayList<>(); AudioSynthesizerPropertyInfo item; @@ -1058,6 +1079,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return items; } + @Override public void open() throws MidiUnavailableException { if (isOpen()) { synchronized (control_mutex) { @@ -1068,6 +1090,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, open(null, null); } + @Override public void open(SourceDataLine line, Map info) throws MidiUnavailableException { if (isOpen()) { synchronized (control_mutex) { @@ -1162,8 +1185,9 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public AudioInputStream openStream(AudioFormat targetFormat, - Map info) throws MidiUnavailableException { + Map info) throws MidiUnavailableException { if (isOpen()) throw new MidiUnavailableException("Synthesizer is already open"); @@ -1243,6 +1267,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public void close() { if (!isOpen()) @@ -1301,12 +1326,14 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public boolean isOpen() { synchronized (control_mutex) { return open; } } + @Override public long getMicrosecondPosition() { if (!isOpen()) @@ -1317,14 +1344,17 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public int getMaxReceivers() { return -1; } + @Override public int getMaxTransmitters() { return 0; } + @Override public Receiver getReceiver() throws MidiUnavailableException { synchronized (control_mutex) { @@ -1335,25 +1365,29 @@ public final class SoftSynthesizer implements AudioSynthesizer, } } + @Override public List getReceivers() { synchronized (control_mutex) { - ArrayList recvs = new ArrayList(); + ArrayList recvs = new ArrayList<>(); recvs.addAll(recvslist); return recvs; } } + @Override public Transmitter getTransmitter() throws MidiUnavailableException { throw new MidiUnavailableException("No transmitter available"); } + @Override public List getTransmitters() { - return new ArrayList(); + return new ArrayList<>(); } + @Override public Receiver getReceiverReferenceCounting() throws MidiUnavailableException { @@ -1367,6 +1401,7 @@ public final class SoftSynthesizer implements AudioSynthesizer, return getReceiver(); } + @Override public Transmitter getTransmitterReferenceCounting() throws MidiUnavailableException { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java index b3cb6c52e91..9ed8871f523 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftTuning.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.UnsupportedEncodingException; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java index ea2cff03531..3808b263c4b 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftVoice.java @@ -22,6 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; import java.io.IOException; @@ -63,8 +64,7 @@ public final class SoftVoice extends VoiceStatus { private final SoftFilter filter_right; private final SoftProcess eg = new SoftEnvelopeGenerator(); private final SoftProcess lfo = new SoftLowFrequencyOscillator(); - Map objects = - new HashMap(); + final Map objects = new HashMap<>(); SoftSynthesizer synthesizer; SoftInstrument instrument; SoftPerformer performer; @@ -107,6 +107,7 @@ public final class SoftVoice extends VoiceStatus { double[] keynumber = co_noteon_keynumber; double[] velocity = co_noteon_velocity; double[] on = co_noteon_on; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -126,12 +127,13 @@ public final class SoftVoice extends VoiceStatus { private final double[] co_mixer_reverb = new double[1]; private final double[] co_mixer_chorus = new double[1]; private final SoftControl co_mixer = new SoftControl() { - double[] active = co_mixer_active; - double[] gain = co_mixer_gain; - double[] pan = co_mixer_pan; - double[] balance = co_mixer_balance; - double[] reverb = co_mixer_reverb; - double[] chorus = co_mixer_chorus; + final double[] active = co_mixer_active; + final double[] gain = co_mixer_gain; + final double[] pan = co_mixer_pan; + final double[] balance = co_mixer_balance; + final double[] reverb = co_mixer_reverb; + final double[] chorus = co_mixer_chorus; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -152,7 +154,8 @@ public final class SoftVoice extends VoiceStatus { }; private final double[] co_osc_pitch = new double[1]; private final SoftControl co_osc = new SoftControl() { - double[] pitch = co_osc_pitch; + final double[] pitch = co_osc_pitch; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -165,9 +168,10 @@ public final class SoftVoice extends VoiceStatus { private final double[] co_filter_type = new double[1]; private final double[] co_filter_q = new double[1]; private final SoftControl co_filter = new SoftControl() { - double[] freq = co_filter_freq; - double[] ftype = co_filter_type; - double[] q = co_filter_q; + final double[] freq = co_filter_freq; + final double[] ftype = co_filter_type; + final double[] q = co_filter_q; + @Override public double[] get(int instance, String name) { if (name == null) return null; @@ -913,6 +917,5 @@ public final class SoftVoice extends VoiceStatus { if (out_mixer_end) { stopping = true; } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java index fd960395b1f..e13bae6ce92 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileReader.java @@ -57,6 +57,7 @@ public final class StandardMidiFileReader extends MidiFileReader { private static final int bisBufferSize = 1024; // buffer size in buffered input streams + @Override public MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException, IOException { return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null); @@ -143,7 +144,7 @@ public final class StandardMidiFileReader extends MidiFileReader { return format; } - + @Override public MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException, IOException { InputStream urlStream = url.openStream(); // throws IOException BufferedInputStream bis = new BufferedInputStream( urlStream, bisBufferSize ); @@ -156,7 +157,7 @@ public final class StandardMidiFileReader extends MidiFileReader { return fileFormat; } - + @Override public MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException, IOException { FileInputStream fis = new FileInputStream(file); // throws IOException BufferedInputStream bis = new BufferedInputStream(fis, bisBufferSize); @@ -175,7 +176,7 @@ public final class StandardMidiFileReader extends MidiFileReader { return fileFormat; } - + @Override public Sequence getSequence(InputStream stream) throws InvalidMidiDataException, IOException { SMFParser smfParser = new SMFParser(); MidiFileFormat format = getMidiFileFormatFromStream(stream, @@ -201,8 +202,7 @@ public final class StandardMidiFileReader extends MidiFileReader { return sequence; } - - + @Override public Sequence getSequence(URL url) throws InvalidMidiDataException, IOException { InputStream is = url.openStream(); // throws IOException is = new BufferedInputStream(is, bisBufferSize); @@ -215,7 +215,7 @@ public final class StandardMidiFileReader extends MidiFileReader { return seq; } - + @Override public Sequence getSequence(File file) throws InvalidMidiDataException, IOException { InputStream is = new FileInputStream(file); // throws IOException is = new BufferedInputStream(is, bisBufferSize); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java index cc75e40e251..a071b83b811 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardMidiFileWriter.java @@ -47,7 +47,6 @@ import javax.sound.midi.SysexMessage; import javax.sound.midi.Track; import javax.sound.midi.spi.MidiFileWriter; - /** * MIDI file writer. * @@ -72,20 +71,15 @@ public final class StandardMidiFileWriter extends MidiFileWriter { private static final int bufferSize = 16384; // buffersize for write private DataOutputStream tddos; // data output stream for track writing - - /** - * MIDI parser types + * MIDI parser types. */ private static final int types[] = { MIDI_TYPE_0, MIDI_TYPE_1 }; - - /** - * new - */ + @Override public int[] getMidiFileTypes() { int[] localArray = new int[types.length]; System.arraycopy(types, 0, localArray, 0, types.length); @@ -100,6 +94,7 @@ public final class StandardMidiFileWriter extends MidiFileWriter { * @return array of file types. If no file types are supported, * returns an array of length 0. */ + @Override public int[] getMidiFileTypes(Sequence sequence){ int typesArray[]; Track tracks[] = sequence.getTracks(); @@ -116,6 +111,7 @@ public final class StandardMidiFileWriter extends MidiFileWriter { return typesArray; } + @Override public int write(Sequence in, int type, OutputStream out) throws IOException { Objects.requireNonNull(out); if (!isFileTypeSupported(type, in)) { @@ -141,6 +137,7 @@ public final class StandardMidiFileWriter extends MidiFileWriter { return (int) bytesWritten; } + @Override public int write(Sequence in, int type, File out) throws IOException { Objects.requireNonNull(in); FileOutputStream fos = new FileOutputStream(out); // throws IOException @@ -151,7 +148,6 @@ public final class StandardMidiFileWriter extends MidiFileWriter { //================================================================================= - private InputStream getFileStream(int type, Sequence sequence) throws IOException { Track tracks[] = sequence.getTracks(); int bytesBuilt = 0; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java index 773fea0e515..a878d123e15 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunCodec.java @@ -55,16 +55,14 @@ abstract class SunCodec extends FormatConversionProvider { this.outputEncodings = outputEncodings; } - - /** - */ + @Override public final AudioFormat.Encoding[] getSourceEncodings() { AudioFormat.Encoding[] encodings = new AudioFormat.Encoding[inputEncodings.length]; System.arraycopy(inputEncodings, 0, encodings, 0, inputEncodings.length); return encodings; } - /** - */ + + @Override public final AudioFormat.Encoding[] getTargetEncodings() { AudioFormat.Encoding[] encodings = new AudioFormat.Encoding[outputEncodings.length]; System.arraycopy(outputEncodings, 0, encodings, 0, outputEncodings.length); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java index 8e9cf96889d..50b200fa75e 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java @@ -39,17 +39,14 @@ import javax.sound.sampled.spi.AudioFileWriter; */ abstract class SunFileWriter extends AudioFileWriter { - // buffer size for write protected static final int bufferSize = 16384; // buffer size for temporary input streams protected static final int bisBufferSize = 4096; - final AudioFileFormat.Type types[]; - /** * Constructs a new SunParser object. */ @@ -57,12 +54,9 @@ abstract class SunFileWriter extends AudioFileWriter { this.types = types; } - - // METHODS TO IMPLEMENT AudioFileWriter - // new, 10.27.99 - + @Override public final AudioFileFormat.Type[] getAudioFileTypes(){ AudioFileFormat.Type[] localArray = new AudioFileFormat.Type[types.length]; System.arraycopy(types, 0, localArray, 0, types.length); @@ -71,7 +65,6 @@ abstract class SunFileWriter extends AudioFileWriter { // HELPER METHODS - /** * rllong * Protected helper method to read 64 bits and changing the order of @@ -213,6 +206,5 @@ abstract class SunFileWriter extends AudioFileWriter { public boolean markSupported() { return in.markSupported(); } - } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java index f1d5addce91..cc1d0a91c49 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java @@ -52,7 +52,6 @@ public final class Toolkit { } } - /** * Swaps bytes. * @throws ArrayOutOfBoundsException if len is not a multiple of 2. @@ -68,7 +67,6 @@ public final class Toolkit { } } - /** * Linear to DB scale conversion. */ @@ -78,7 +76,6 @@ public final class Toolkit { return dB; } - /** * DB to linear scale conversion. */ @@ -108,7 +105,6 @@ public final class Toolkit { return bytes - (bytes % blockSize); } - /* * gets the number of bytes needed to play the specified number of milliseconds */ @@ -188,7 +184,6 @@ public final class Toolkit { } } - static boolean isFullySpecifiedPCMFormat(AudioFormat format) { if (!format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED) && !format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED)) { @@ -204,7 +199,6 @@ public final class Toolkit { return true; } - public static AudioInputStream getPCMConvertedAudioInputStream(AudioInputStream ais) { // we can't open the device for non-PCM playback, so we have // convert any other encodings to PCM here (at least we try!) @@ -231,5 +225,4 @@ public final class Toolkit { return ais; } - } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java index 9dfcb444efd..3d39395da9c 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/UlawCodec.java @@ -33,7 +33,6 @@ import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; - /** * U-law encodes linear data, and decodes u-law data to linear data. * @@ -53,7 +52,7 @@ public final class UlawCodec extends SunCodec { 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF}; /** - * Initializes the decode tables + * Initializes the decode tables. */ static { for (int i=0;i<256;i++) { @@ -70,7 +69,6 @@ public final class UlawCodec extends SunCodec { } } - /** * Constructs a new ULAW codec object. */ @@ -78,8 +76,7 @@ public final class UlawCodec extends SunCodec { super(ulawEncodings, ulawEncodings); } - /** - */ + @Override public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat){ if( AudioFormat.Encoding.PCM_SIGNED.equals(sourceFormat.getEncoding()) ) { if( sourceFormat.getSampleSizeInBits() == 16 ) { @@ -102,9 +99,7 @@ public final class UlawCodec extends SunCodec { } } - - /** - */ + @Override public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){ Objects.requireNonNull(targetEncoding); Objects.requireNonNull(sourceFormat); @@ -119,8 +114,7 @@ public final class UlawCodec extends SunCodec { } } - /** - */ + @Override public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream){ AudioFormat sourceFormat = sourceStream.getFormat(); AudioFormat.Encoding sourceEncoding = sourceFormat.getEncoding(); @@ -157,9 +151,7 @@ public final class UlawCodec extends SunCodec { return getConvertedStream(targetFormat, sourceStream); } - /** - * use old code... - */ + @Override public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){ if (!isConversionSupported(targetFormat, sourceStream.getFormat())) throw new IllegalArgumentException("Unsupported conversion: " @@ -168,9 +160,6 @@ public final class UlawCodec extends SunCodec { return getConvertedStream(targetFormat, sourceStream); } - - // OLD CODE - /** * Opens the codec with the specified parameters. * @param stream stream from which data to be processed should be read @@ -179,7 +168,6 @@ public final class UlawCodec extends SunCodec { * @throws IllegalArgumentException if the format combination supplied is * not supported. */ - /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { */ private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { AudioInputStream cs = null; @@ -188,7 +176,7 @@ public final class UlawCodec extends SunCodec { if( inputFormat.matches(outputFormat) ) { cs = stream; } else { - cs = (AudioInputStream) (new UlawCodecStream(stream, outputFormat)); + cs = new UlawCodecStream(stream, outputFormat); } return cs; } @@ -200,7 +188,6 @@ public final class UlawCodec extends SunCodec { * returns an array of length 0. * @return array of supported output formats. */ - /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */ private AudioFormat[] getOutputFormats(AudioFormat inputFormat) { Vector formats = new Vector<>(); @@ -241,14 +228,13 @@ public final class UlawCodec extends SunCodec { return formatArray; } - private final class UlawCodecStream extends AudioInputStream { private static final int tempBufferSize = 64; private byte tempBuffer [] = null; /** - * True to encode to u-law, false to decode to linear + * True to encode to u-law, false to decode to linear. */ boolean encode = false; @@ -312,7 +298,6 @@ public final class UlawCodec extends SunCodec { } } - /* * $$jb 2/23/99 * Used to determine segment number in uLaw encoding @@ -328,6 +313,7 @@ public final class UlawCodec extends SunCodec { * Note that this won't actually read anything; must read in * two-byte units. */ + @Override public int read() throws IOException { byte[] b = new byte[1]; if (read(b, 0, b.length) == 1) { @@ -336,10 +322,12 @@ public final class UlawCodec extends SunCodec { return -1; } + @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + @Override public int read(byte[] b, int off, int len) throws IOException { // don't read fractional frames if( len%frameSize != 0 ) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java index 5066ba29ea5..179fd8d9b76 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java @@ -43,7 +43,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; */ public final class WaveExtensibleFileReader extends SunFileReader { - private static class GUID { + private static final class GUID { private long i1; private int s1; private int s2; @@ -222,7 +222,7 @@ public final class WaveExtensibleFileReader extends SunFileReader { if (!fmt_found || !data_found) { throw new UnsupportedAudioFileException(); } - Map p = new HashMap(); + Map p = new HashMap<>(); String s_channelmask = decodeChannelMask(channelMask); if (s_channelmask != null) p.put("channelOrder", s_channelmask); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java index bf3abbf684a..059bc06a71a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java @@ -46,7 +46,7 @@ final class WaveFileFormat extends StandardFileFormat { //$$fb 2002-04-16: Fix for 4636355: RIFF audio headers could be _more_ spec compliant /** - * fmt_ chunk size in bytes + * fmt_ chunk size in bytes. */ private static final int STANDARD_FMT_CHUNK_SIZE = 16; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java index 752afc512c9..04591d2b136 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileWriter.java @@ -80,7 +80,6 @@ public final class WaveFileWriter extends SunFileWriter { return new AudioFileFormat.Type[0]; } - @Override public int write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out) throws IOException { Objects.requireNonNull(stream); @@ -104,7 +103,6 @@ public final class WaveFileWriter extends SunFileWriter { return writeWaveFile(stream, waveFileFormat, out); } - @Override public int write(AudioInputStream stream, AudioFileFormat.Type fileType, File out) throws IOException { Objects.requireNonNull(stream); @@ -257,7 +255,7 @@ public final class WaveFileWriter extends SunFileWriter { int sampleRate = (int) audioFormat.getSampleRate(); int frameSizeInBytes = audioFormat.getFrameSize(); int frameRate = (int) audioFormat.getFrameRate(); - int avgBytesPerSec = channels * sampleSizeInBits * sampleRate / 8;; + int avgBytesPerSec = channels * sampleSizeInBits * sampleRate / 8; short blockAlign = (short) ((sampleSizeInBits / 8) * channels); int dataMagic = WaveFileFormat.DATA_MAGIC; int dataLength = waveFileFormat.getFrameLength() * frameSizeInBytes; @@ -347,6 +345,6 @@ public final class WaveFileWriter extends SunFileWriter { waveStream = new SequenceInputStream(headerStream, new NoCloseInputStream(codedAudioStream)); - return (InputStream)waveStream; + return waveStream; } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java index b2529f48f5c..bd977b92ebf 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileWriter.java @@ -89,7 +89,7 @@ public final class WaveFloatFileWriter extends AudioFileWriter { data_chunk.close(); } - private static class NoCloseOutputStream extends OutputStream { + private static final class NoCloseOutputStream extends OutputStream { final OutputStream out; NoCloseOutputStream(OutputStream out) { diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java index edb326852f3..8c6a5904378 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java @@ -195,6 +195,7 @@ public class MetaMessage extends MidiMessage { * * @return a clone of this instance */ + @Override public Object clone() { byte[] newData = new byte[length]; System.arraycopy(data, 0, newData, 0, newData.length); diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java index de67ee2cd61..4b8366624ba 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiDevice.java @@ -134,6 +134,7 @@ public interface MidiDevice extends AutoCloseable { * @see #open * @see #isOpen */ + @Override void close(); /** @@ -252,22 +253,22 @@ public interface MidiDevice extends AutoCloseable { /** * The device's name. */ - private String name; + private final String name; /** * The name of the company who provides the device. */ - private String vendor; + private final String vendor; /** * A description of the device. */ - private String description; + private final String description; /** * Device version. */ - private String version; + private final String version; /** * Constructs a device info object. @@ -294,6 +295,7 @@ public interface MidiDevice extends AutoCloseable { * @return {@code true} if this object is the same as the {@code obj} * argument; {@code false} otherwise */ + @Override public final boolean equals(Object obj) { return super.equals(obj); } @@ -301,6 +303,7 @@ public interface MidiDevice extends AutoCloseable { /** * Finalizes the hashcode method. */ + @Override public final int hashCode() { return super.hashCode(); } @@ -346,6 +349,7 @@ public interface MidiDevice extends AutoCloseable { * * @return a description of the info object */ + @Override public final String toString() { return name; } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java index 474881571c4..0fa5db72ec8 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiFileFormat.java @@ -180,7 +180,7 @@ public class MidiFileFormat { int resolution, int bytes, long microseconds, Map properties) { this(type, divisionType, resolution, bytes, microseconds); - this.properties = new HashMap(properties); + this.properties = new HashMap<>(properties); } /** @@ -257,7 +257,7 @@ public class MidiFileFormat { public Map properties() { Map ret; if (properties == null) { - ret = new HashMap(0); + ret = new HashMap<>(0); } else { ret = (Map) (properties.clone()); } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java index bc018758c68..f7b8b9b5b3a 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java @@ -177,5 +177,6 @@ public abstract class MidiMessage implements Cloneable { * * @return a clone of this instance */ + @Override public abstract Object clone(); } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java index 55e038cfa86..076f9588efa 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Receiver.java @@ -66,5 +66,6 @@ public interface Receiver extends AutoCloseable { * * @see javax.sound.midi.MidiSystem#getReceiver */ + @Override void close(); } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java index b6b035b8308..b8cfba0adcb 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java @@ -118,7 +118,7 @@ public class Sequence { * * @see #getTracks */ - protected Vector tracks = new Vector(); + protected Vector tracks = new Vector<>(); /** * Constructs a new MIDI sequence with the specified timing division type diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java index 17d6a9dc197..4050f385cc8 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java @@ -324,6 +324,7 @@ public interface Sequencer extends MidiDevice { * @return the current position in microseconds * @see #setMicrosecondPosition */ + @Override long getMicrosecondPosition(); /** @@ -680,7 +681,7 @@ public interface Sequencer extends MidiDevice { /** * Synchronization mode name. */ - private String name; + private final String name; /** * Constructs a synchronization mode. @@ -700,6 +701,7 @@ public interface Sequencer extends MidiDevice { * @return {@code true} if this object is the same as the {@code obj} * argument, {@code false} otherwise */ + @Override public final boolean equals(Object obj) { return super.equals(obj); @@ -708,6 +710,7 @@ public interface Sequencer extends MidiDevice { /** * Finalizes the hashcode method. */ + @Override public final int hashCode() { return super.hashCode(); @@ -719,6 +722,7 @@ public interface Sequencer extends MidiDevice { * * @return the name of this synchronization mode */ + @Override public final String toString() { return name; diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java index 782d9588de1..8d0a9a22253 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java @@ -429,6 +429,7 @@ public class ShortMessage extends MidiMessage { * * @return a clone of this instance */ + @Override public Object clone() { byte[] newData = new byte[length]; System.arraycopy(data, 0, newData, 0, newData.length); diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java index 23ba4f8f50c..de478c3be31 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java @@ -179,6 +179,7 @@ public class SysexMessage extends MidiMessage { * @param length the length of the valid message data in the array, * including the status byte */ + @Override public void setMessage(byte[] data, int length) throws InvalidMidiDataException { int status = (data[0] & 0xFF); if ((status != 0xF0) && (status != 0xF7)) { @@ -233,6 +234,7 @@ public class SysexMessage extends MidiMessage { * * @return a clone of this instance */ + @Override public Object clone() { byte[] newData = new byte[length]; System.arraycopy(data, 0, newData, 0, newData.length); diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java index 95a42c7f703..45320512334 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Track.java @@ -65,12 +65,12 @@ public class Track { // TODO: use arrays for faster access // the list containing the events - private ArrayList eventsList = new ArrayList<>(); + private final ArrayList eventsList = new ArrayList<>(); // use a hashset to detect duplicate events in add(MidiEvent) - private HashSet set = new HashSet<>(); + private final HashSet set = new HashSet<>(); - private MidiEvent eotEvent; + private final MidiEvent eotEvent; /** * Package-private constructor. Constructs a new, empty Track object, which @@ -264,6 +264,7 @@ public class Track { data[2] = 0; } + @Override public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException { throw new InvalidMidiDataException("cannot modify end of track message"); } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java index 639aa2c750d..0b1a4507610 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Transmitter.java @@ -69,5 +69,6 @@ public interface Transmitter extends AutoCloseable { * * @see javax.sound.midi.MidiSystem#getTransmitter */ + @Override void close(); } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java index 9c6ba5a3e4e..b88dfccb44b 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFileFormat.java @@ -100,22 +100,22 @@ public class AudioFileFormat { /** * File type. */ - private Type type; + private final Type type; /** * File length in bytes. */ - private int byteLength; + private final int byteLength; /** * Format of the audio data contained in the file. */ - private AudioFormat format; + private final AudioFormat format; /** * Audio data length in sample frames. */ - private int frameLength; + private final int frameLength; /** * The set of properties. @@ -176,7 +176,7 @@ public class AudioFileFormat { public AudioFileFormat(Type type, AudioFormat format, int frameLength, Map properties) { this(type,AudioSystem.NOT_SPECIFIED,format,frameLength); - this.properties = new HashMap(properties); + this.properties = new HashMap<>(properties); } /** diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java index 5728d6287cf..474e1cf5516 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioFormat.java @@ -223,7 +223,7 @@ public class AudioFormat { boolean bigEndian, Map properties) { this(encoding, sampleRate, sampleSizeInBits, channels, frameSize, frameRate, bigEndian); - this.properties = new HashMap(properties); + this.properties = new HashMap<>(properties); } /** @@ -592,7 +592,7 @@ public class AudioFormat { /** * Encoding name. */ - private String name; + private final String name; /** * Constructs a new encoding. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java index 242a3157d99..996a7b2a5a0 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/AudioInputStream.java @@ -60,7 +60,7 @@ public class AudioInputStream extends InputStream { * The {@code InputStream} from which this {@code AudioInputStream} object * was constructed. */ - private InputStream stream; + private final InputStream stream; /** * The format of the audio data contained in the stream. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java index 8cd400d7ea0..64d9bbabc8b 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/CompoundControl.java @@ -38,7 +38,7 @@ public abstract class CompoundControl extends Control { /** * The set of member controls. */ - private Control[] controls; + private final Control[] controls; /** * Constructs a new compound control object with the given parameters. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java index a3257b8539e..bdd3bca4309 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Control.java @@ -84,7 +84,7 @@ public abstract class Control { /** * Type name. */ - private String name; + private final String name; /** * Constructs a new control type with the name specified. The name diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java index cdbb5f7d3f7..44048289142 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/EnumControl.java @@ -53,7 +53,7 @@ public abstract class EnumControl extends Control { /** * The set of possible values. */ - private Object[] values; + private final Object[] values; /** * The current value. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java index 27d59fefe1f..485225b85f0 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java @@ -54,23 +54,23 @@ public abstract class FloatControl extends Control { /** * The minimum supported value. */ - private float minimum; + private final float minimum; /** * The maximum supported value. */ - private float maximum; + private final float maximum; /** * The control's precision. */ - private float precision; + private final float precision; /** * The smallest time increment in which a value change can be effected * during a value shift, in microseconds. */ - private int updatePeriod; + private final int updatePeriod; /** * A label for the units in which the control values are expressed, such as @@ -334,6 +334,7 @@ public abstract class FloatControl extends Control { * * @return a string description */ + @Override public String toString() { return new String(getType() + " with current value: " + getValue() + " " + units + " (range: " + minimum + " - " + maximum + ")"); diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java index 95f9be6dcf6..19fb585eae5 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java @@ -169,8 +169,7 @@ public class LineEvent extends EventObject { /** * Type name. */ - // $$kk: 03.25.99: why can't this be final?? - private /*final*/ String name; + private final String name; /** * Constructs a new event type. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java index 61f40c761a5..08596f031eb 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/Port.java @@ -56,10 +56,8 @@ public interface Port extends Line { */ class Info extends Line.Info { - // AUDIO PORT TYPE DEFINES - // SOURCE PORTS /** @@ -78,7 +76,6 @@ public interface Port extends Line { */ public static final Info COMPACT_DISC = new Info(Port.class,"COMPACT_DISC", true); - // TARGET PORTS /** @@ -97,18 +94,14 @@ public interface Port extends Line { */ public static final Info LINE_OUT = new Info(Port.class,"LINE_OUT", false); - // FUTURE DIRECTIONS... // telephone // DAT // DVD - - // INSTANCE VARIABLES - - private String name; - private boolean isSource; + private final String name; + private final boolean isSource; /** * Constructs a port's info object from the information given. This diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java index e308b0f9402..20fb453e205 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/ReverbType.java @@ -139,32 +139,32 @@ public class ReverbType { /** * Descriptive name of the reverb type. */ - private String name; + private final String name; /** * Early reflection delay in microseconds. */ - private int earlyReflectionDelay; + private final int earlyReflectionDelay; /** * Early reflection intensity. */ - private float earlyReflectionIntensity; + private final float earlyReflectionIntensity; /** * Late reflection delay in microseconds. */ - private int lateReflectionDelay; + private final int lateReflectionDelay; /** * Late reflection intensity. */ - private float lateReflectionIntensity; + private final float lateReflectionIntensity; /** * Total decay time. */ - private int decayTime; + private final int decayTime; /** * Constructs a new reverb type that has the specified reverberation From 73837a5f34d909cf25b830f649db5f2a1d5e7b30 Mon Sep 17 00:00:00 2001 From: George Triantafillou Date: Mon, 15 Aug 2016 15:35:27 -0400 Subject: [PATCH 062/115] 8160833: ClassesByName2Test.java and RedefineCrossEvent.java failing with jtreg tip Reviewed-by: dholmes, ctornqvi --- jdk/test/com/sun/jdi/ClassesByName2Test.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/jdk/test/com/sun/jdi/ClassesByName2Test.java b/jdk/test/com/sun/jdi/ClassesByName2Test.java index f7bd695bbf5..2a7c5288cc3 100644 --- a/jdk/test/com/sun/jdi/ClassesByName2Test.java +++ b/jdk/test/com/sun/jdi/ClassesByName2Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, 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 @@ -28,8 +28,7 @@ * * @author Tim Bell (based on ClassesByName by Robert Field) * - * @modules java.corba - * jdk.jdi + * @modules jdk.jdi * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ClassesByName2Test.java * @run driver ClassesByName2Test @@ -70,10 +69,14 @@ class ClassesByName2Targ { }; Thread two = new Thread ("TWO") { - public void run () { - javax.rmi.CORBA.Util.getCodebase(this.getClass()); + public void run () { + try { + String s = String.format("%02x", 0xff); + } catch (Exception e) { + e.printStackTrace(); } - }; + } + }; two.start(); one.start(); From 2a46a44214d3598b47bd15b2369b968690c62175 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Mon, 15 Aug 2016 13:06:50 -0700 Subject: [PATCH 063/115] 8133749: os::current_frame() is not returning the proper frame on ARM and solaris-x64 Need to go up one extra frame to be consistent with other platforms. Reviewed-by: dholmes, zgu --- hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 328ac2ebc7a..7713550f374 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 @@ -292,15 +292,19 @@ extern "C" intptr_t *_get_current_fp(); // in .il file frame os::current_frame() { intptr_t* fp = _get_current_fp(); // it's inlined so want current fp + // fp is for os::current_frame. We want the fp for our caller. frame myframe((intptr_t*)os::current_stack_pointer(), (intptr_t*)fp, CAST_FROM_FN_PTR(address, os::current_frame)); - if (os::is_first_C_frame(&myframe)) { + frame caller_frame = os::get_sender_for_C_frame(&myframe); + + if (os::is_first_C_frame(&caller_frame)) { // stack is not walkable frame ret; // This will be a null useless frame return ret; } else { - return os::get_sender_for_C_frame(&myframe); + // return frame for our caller's caller + return os::get_sender_for_C_frame(&caller_frame); } } From eabe746ff66d39153208ad08e0d885360b449b04 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Mon, 15 Aug 2016 13:13:48 -0700 Subject: [PATCH 064/115] 8133747: NMT includes an extra stack frame due to assumption NMT is making on tail calls being used Better frame skipping logic in NativeCallStack::NativeCallStack. Reviewed-by: dholmes, zgu --- hotspot/src/os/posix/vm/os_posix.cpp | 4 - hotspot/src/os/windows/vm/os_windows.cpp | 3 - .../share/vm/utilities/nativeCallStack.cpp | 15 ++- .../NMT/CheckForProperDetailStackTrace.java | 114 ++++++++++++++++++ 4 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 hotspot/test/runtime/NMT/CheckForProperDetailStackTrace.java diff --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp index 6ed034c3bf5..2b7407dc985 100644 --- a/hotspot/src/os/posix/vm/os_posix.cpp +++ b/hotspot/src/os/posix/vm/os_posix.cpp @@ -93,10 +93,6 @@ void os::check_dump_limit(char* buffer, size_t bufferSize) { } int os::get_native_stack(address* stack, int frames, int toSkip) { -#ifdef _NMT_NOINLINE_ - toSkip++; -#endif - int frame_idx = 0; int num_of_frames; // number of frames captured frame fr = os::current_frame(); diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index bd85cf01e61..5dfdab012d6 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -318,9 +318,6 @@ extern "C" void breakpoint() { // only supported on Windows XP or later. // int os::get_native_stack(address* stack, int frames, int toSkip) { -#ifdef _NMT_NOINLINE_ - toSkip++; -#endif int captured = RtlCaptureStackBackTrace(toSkip + 1, frames, (PVOID*)stack, NULL); for (int index = captured; index < frames; index ++) { stack[index] = NULL; diff --git a/hotspot/src/share/vm/utilities/nativeCallStack.cpp b/hotspot/src/share/vm/utilities/nativeCallStack.cpp index 940b3c8840e..b606f9e9c00 100644 --- a/hotspot/src/share/vm/utilities/nativeCallStack.cpp +++ b/hotspot/src/share/vm/utilities/nativeCallStack.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 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 @@ -33,6 +33,19 @@ NativeCallStack::NativeCallStack(int toSkip, bool fillStack) : _hash_value(0) { if (fillStack) { + // We need to skip the NativeCallStack::NativeCallStack frame if a tail call is NOT used + // to call os::get_native_stack. A tail call is used if _NMT_NOINLINE_ is not defined + // (which means this is not a slowdebug build), and we are on 64-bit (except Windows). + // This is not necessarily a rule, but what has been obvserved to date. +#define TAIL_CALL (!defined(_NMT_NOINLINE_) && !defined(WINDOWS) && defined(_LP64)) +#if !TAIL_CALL + toSkip++; +#if (defined(_NMT_NOINLINE_) && defined(BSD) && defined(_LP64)) + // Mac OS X slowdebug builds have this odd behavior where NativeCallStack::NativeCallStack + // appears as two frames, so we need to skip an extra frame. + toSkip++; +#endif +#endif os::get_native_stack(_stack, NMT_TrackingStackDepth, toSkip); } else { for (int index = 0; index < NMT_TrackingStackDepth; index ++) { diff --git a/hotspot/test/runtime/NMT/CheckForProperDetailStackTrace.java b/hotspot/test/runtime/NMT/CheckForProperDetailStackTrace.java new file mode 100644 index 00000000000..7936a9b7253 --- /dev/null +++ b/hotspot/test/runtime/NMT/CheckForProperDetailStackTrace.java @@ -0,0 +1,114 @@ +/* + * 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 + * @key nmt + * @summary Running with NMT detail should produce expected stack traces. + * @library /testlibrary + * @modules java.base/jdk.internal.misc + * java.management + */ + +import jdk.test.lib.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CheckForProperDetailStackTrace { + /* The stack trace we look for by default. Note that :: has been replaced by .* + to make sure it maches even if the symbol is not unmangled. */ + public static String stackTraceDefault = + ".*ModuleEntryTable.*new_entry.*\n" + + ".*ModuleEntryTable.*locked_create_entry_or_null.*\n" + + ".*Modules.*define_module.*\n" + + ".*JVM_DefineModule.*\n"; + + /* The stack trace we look for on Solaris and Windows slowdebug builds. For some + reason ALWAYSINLINE for AllocateHeap is ignored, so it appears in the stack strace. */ + public static String stackTraceAllocateHeap = + ".*AllocateHeap.*\n" + + ".*ModuleEntryTable.*new_entry.*\n" + + ".*ModuleEntryTable.*locked_create_entry_or_null.*\n" + + ".*Modules.*define_module.*\n"; + + /* A symbol that should always be present in NMT detail output. */ + private static String expectedSymbol = + "locked_create_entry_or_null"; + + private static final String jdkDebug = System.getProperty("jdk.debug"); + private static boolean isSlowDebugBuild() { + return (jdkDebug.toLowerCase().equals("slowdebug")); + } + + public static void main(String args[]) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:NativeMemoryTracking=detail", + "-XX:+PrintNMTStatistics", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + + output.shouldHaveExitValue(0); + + // We should never see either of these frames because they are supposed to be skipped. */ + output.shouldNotContain("NativeCallStack::NativeCallStack"); + output.shouldNotContain("os::get_native_stack"); + + // AllocateHeap shouldn't be in the output because it is suppose to always be inlined. + // We check for that here, but allow it for Windows and Solaris slowdebug builds because + // the compiler ends up not inlining AllocateHeap. + Boolean okToHaveAllocateHeap = + isSlowDebugBuild() && (Platform.isSolaris() || Platform.isWindows()); + if (!okToHaveAllocateHeap) { + output.shouldNotContain("AllocateHeap"); + } + + // See if we have any stack trace symbols in the output + boolean hasSymbols = + output.getStdout().contains(expectedSymbol) || output.getStderr().contains(expectedSymbol); + if (!hasSymbols) { + // It's ok for ARM not to have symbols, because it does not support NMT detail + // when targeting thumb2. It's also ok for Windows not to have symbols, because + // they are only available if the symbols file is included with the build. + if (Platform.isWindows() || Platform.isARM()) { + return; // we are done + } + output.reportDiagnosticSummary(); + throw new RuntimeException("Expected symbol missing missing from output: " + expectedSymbol); + } + + /* Make sure the expected NMT detail stack trace is found. */ + String expectedStackTrace = + (okToHaveAllocateHeap ? stackTraceAllocateHeap : stackTraceDefault); + if (!stackTraceMatches(expectedStackTrace, output)) { + output.reportDiagnosticSummary(); + throw new RuntimeException("Expected stack trace missing missing from output: " + expectedStackTrace); + } + } + + public static boolean stackTraceMatches(String stackTrace, OutputAnalyzer output) { + Matcher stdoutMatcher = Pattern.compile(stackTrace, Pattern.MULTILINE).matcher(output.getStdout()); + Matcher stderrMatcher = Pattern.compile(stackTrace, Pattern.MULTILINE).matcher(output.getStderr()); + return (stdoutMatcher.find() || stderrMatcher.find()); + } +} From e3c3a54f7aad85790417093273a61d775d2ed539 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Mon, 15 Aug 2016 13:14:08 -0700 Subject: [PATCH 065/115] 8133740: NMT for Linux/x86/x64 and bsd/x64 slowdebug builds includes NativeCallStack::NativeCallStack() frame in backtrace Skip an extra frame in _get_previous_fp() when it is not inlined. Reviewed-by: dholmes, zgu --- hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp | 10 +++++++++- hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp | 10 +++++++++- hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp | 8 ++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) 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 5f7d479726c..0bdbc7c3aaa 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 @@ -417,7 +417,15 @@ intptr_t* _get_previous_fp() { #else register intptr_t **ebp __asm__ (SPELL_REG_FP); #endif - return (intptr_t*) *ebp; // we want what it points to. + // ebp is for this frame (_get_previous_fp). We want the ebp for the + // caller of os::current_frame*(), so go up two frames. However, for + // optimized builds, _get_previous_fp() will be inlined, so only go + // up 1 frame in that case. +#ifdef _NMT_NOINLINE_ + return **(intptr_t***)ebp; +#else + return *ebp; +#endif } 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 06a8a6eb5f1..6eeb1280c82 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 @@ -235,7 +235,15 @@ intptr_t* _get_previous_fp() { #else register intptr_t **ebp __asm__ (SPELL_REG_FP); #endif - return (intptr_t*) *ebp; // we want what it points to. + // ebp is for this frame (_get_previous_fp). We want the ebp for the + // caller of os::current_frame*(), so go up two frames. However, for + // optimized builds, _get_previous_fp() will be inlined, so only go + // up 1 frame in that case. +#ifdef _NMT_NOINLINE_ + return **(intptr_t***)ebp; +#else + return *ebp; +#endif } diff --git a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp index efb1b3b0851..f3df7d386d6 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp +++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp @@ -496,7 +496,15 @@ intptr_t* _get_previous_fp() { __asm { mov frameptr, ebp }; + // ebp (frameptr) is for this frame (_get_previous_fp). We want the ebp for the + // caller of os::current_frame*(), so go up two frames. However, for + // optimized builds, _get_previous_fp() will be inlined, so only go + // up 1 frame in that case. +#ifdef _NMT_NOINLINE_ + return **(intptr_t***)frameptr; +#else return *frameptr; +#endif } #endif // !AMD64 From d928f3fae8448f7bcfe3e7859d945e216acbf4d6 Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Mon, 15 Aug 2016 23:45:32 +0300 Subject: [PATCH 066/115] 8163896: Finalizing one key of a KeyPair invalidates the other key Reviewed-by: coffeys, vinnie --- .../classes/sun/security/mscapi/Key.java | 64 +++++++------ .../classes/sun/security/mscapi/KeyStore.java | 6 +- .../sun/security/mscapi/RSAKeyPair.java | 7 +- .../sun/security/mscapi/RSAPrivateKey.java | 16 +++- .../sun/security/mscapi/RSAPublicKey.java | 20 +++-- .../KeyPairGenerator/FinalizeHalf.java | 90 +++++++++++++++++++ 6 files changed, 158 insertions(+), 45 deletions(-) create mode 100644 jdk/test/java/security/KeyPairGenerator/FinalizeHalf.java diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/Key.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/Key.java index 0124ffb3a40..8154c489a95 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/Key.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/Key.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -30,7 +30,6 @@ import sun.security.util.Length; /** * The handle for an RSA or DSA key using the Microsoft Crypto API. * - * @see DSAPrivateKey * @see RSAPrivateKey * @see RSAPublicKey * @@ -41,9 +40,35 @@ abstract class Key implements java.security.Key, Length { private static final long serialVersionUID = -1088859394025049194L; - // Native handle - protected long hCryptProv = 0; - protected long hCryptKey = 0; + static class NativeHandles { + long hCryptProv = 0; + long hCryptKey = 0; + + public NativeHandles(long hCryptProv, long hCryptKey) { + this.hCryptProv = hCryptProv; + this.hCryptKey = hCryptKey; + } + + /** + * Finalization method + */ + protected void finalize() throws Throwable + { + try { + synchronized(this) + { + cleanUp(hCryptProv, hCryptKey); + hCryptProv = 0; + hCryptKey = 0; + } + + } finally { + super.finalize(); + } + } + } + + protected NativeHandles handles; // Key length protected int keyLength = 0; @@ -51,31 +76,12 @@ abstract class Key implements java.security.Key, Length /** * Construct a Key object. */ - protected Key(long hCryptProv, long hCryptKey, int keyLength) + protected Key(NativeHandles handles, int keyLength) { - this.hCryptProv = hCryptProv; - this.hCryptKey = hCryptKey; + this.handles = handles; this.keyLength = keyLength; } - /** - * Finalization method - */ - protected void finalize() throws Throwable - { - try { - synchronized(this) - { - cleanUp(hCryptProv, hCryptKey); - hCryptProv = 0; - hCryptKey = 0; - } - - } finally { - super.finalize(); - } - } - /** * Native method to cleanup the key handle. */ @@ -96,7 +102,7 @@ abstract class Key implements java.security.Key, Length */ public long getHCryptKey() { - return hCryptKey; + return handles.hCryptKey; } /** @@ -104,12 +110,12 @@ abstract class Key implements java.security.Key, Length */ public long getHCryptProvider() { - return hCryptProv; + return handles.hCryptProv; } /** * Returns the standard algorithm name for this key. For - * example, "DSA" would indicate that this key is a DSA key. + * example, "RSA" would indicate that this key is a RSA key. * See Appendix A in the * Java Cryptography Architecture API Specification & Reference diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java index 84828c156bf..c4888bf3049 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java @@ -168,7 +168,7 @@ abstract class KeyStore extends KeyStoreSpi { } certChain = chain; } - }; + } /* * An X.509 certificate factory. @@ -798,7 +798,8 @@ abstract class KeyStore extends KeyStoreSpi { } storeWithUniqueAlias(alias, new KeyEntry(alias, - new RSAPrivateKey(hCryptProv, hCryptKey, keyLength), + new RSAPrivateKey(new Key.NativeHandles(hCryptProv, + hCryptKey), keyLength), certChain)); } catch (Throwable e) @@ -854,7 +855,6 @@ abstract class KeyStore extends KeyStoreSpi { * Load keys and/or certificates from keystore into Collection. * * @param name Name of keystore. - * @param entries Collection of key/certificate. */ private native void loadKeysOrCertificateChains(String name) throws KeyStoreException; diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPair.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPair.java index 6fba2a23cd8..0880c20d85d 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPair.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPair.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -41,8 +41,9 @@ class RSAKeyPair { */ RSAKeyPair(long hCryptProv, long hCryptKey, int keyLength) { - privateKey = new RSAPrivateKey(hCryptProv, hCryptKey, keyLength); - publicKey = new RSAPublicKey(hCryptProv, hCryptKey, keyLength); + Key.NativeHandles handles = new Key.NativeHandles(hCryptProv, hCryptKey); + privateKey = new RSAPrivateKey(handles, keyLength); + publicKey = new RSAPublicKey(handles, keyLength); } public RSAPrivateKey getPrivate() { diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPrivateKey.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPrivateKey.java index bc530f5372b..ca692dfa2f3 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPrivateKey.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -42,7 +42,15 @@ class RSAPrivateKey extends Key implements PrivateKey */ RSAPrivateKey(long hCryptProv, long hCryptKey, int keyLength) { - super(hCryptProv, hCryptKey, keyLength); + super(new NativeHandles(hCryptProv, hCryptKey), keyLength); + } + + /** + * Construct an RSAPrivateKey object. + */ + RSAPrivateKey(NativeHandles handles, int keyLength) + { + super(handles, keyLength); } /** @@ -63,8 +71,8 @@ class RSAPrivateKey extends Key implements PrivateKey public String toString() { return "RSAPrivateKey [size=" + keyLength + " bits, type=" + - getKeyType(hCryptKey) + ", container=" + - getContainerName(hCryptProv) + "]"; + getKeyType(handles.hCryptKey) + ", container=" + + getContainerName(handles.hCryptProv) + "]"; } // This class is not serializable diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPublicKey.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPublicKey.java index a62d783aa7c..52081abb5aa 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPublicKey.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -51,7 +51,15 @@ class RSAPublicKey extends Key implements java.security.interfaces.RSAPublicKey */ RSAPublicKey(long hCryptProv, long hCryptKey, int keyLength) { - super(hCryptProv, hCryptKey, keyLength); + super(new NativeHandles(hCryptProv, hCryptKey), keyLength); + } + + /** + * Construct an RSAPublicKey object. + */ + RSAPublicKey(NativeHandles handles, int keyLength) + { + super(handles, keyLength); } /** @@ -77,8 +85,8 @@ class RSAPublicKey extends Key implements java.security.interfaces.RSAPublicKey StringBuffer sb = new StringBuffer(); sb.append("RSAPublicKey [size=").append(keyLength) - .append(" bits, type=").append(getKeyType(hCryptKey)) - .append(", container=").append(getContainerName(hCryptProv)) + .append(" bits, type=").append(getKeyType(handles.hCryptKey)) + .append(", container=").append(getContainerName(handles.hCryptProv)) .append("]\n modulus: ").append(getModulus()) .append("\n public exponent: ").append(getPublicExponent()); @@ -93,7 +101,7 @@ class RSAPublicKey extends Key implements java.security.interfaces.RSAPublicKey if (exponent == null) { try { - publicKeyBlob = getPublicKeyBlob(hCryptKey); + publicKeyBlob = getPublicKeyBlob(handles.hCryptKey); exponent = new BigInteger(1, getExponent(publicKeyBlob)); } catch (KeyException e) { @@ -112,7 +120,7 @@ class RSAPublicKey extends Key implements java.security.interfaces.RSAPublicKey if (modulus == null) { try { - publicKeyBlob = getPublicKeyBlob(hCryptKey); + publicKeyBlob = getPublicKeyBlob(handles.hCryptKey); modulus = new BigInteger(1, getModulus(publicKeyBlob)); } catch (KeyException e) { diff --git a/jdk/test/java/security/KeyPairGenerator/FinalizeHalf.java b/jdk/test/java/security/KeyPairGenerator/FinalizeHalf.java new file mode 100644 index 00000000000..a2a1eb36194 --- /dev/null +++ b/jdk/test/java/security/KeyPairGenerator/FinalizeHalf.java @@ -0,0 +1,90 @@ +/* + * 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 8163896 + * @summary Finalizing one key of a KeyPair invalidates the other key + */ + +import java.security.Key; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.Provider; +import java.security.ProviderException; +import java.security.Security; +import java.util.function.Consumer; +import java.util.ArrayList; +import java.util.List; + +public class FinalizeHalf { + + static int failures = 0; + + public static void main(String[] args) throws Throwable { + List> methods = new ArrayList<>(); + methods.add((Key k) -> k.getEncoded()); + methods.add((Key k) -> k.toString()); + + for (String algo : new String[] {"DiffieHellman", "DSA", "RSA"}) { + for (Provider provider : Security.getProviders()) { + for (boolean priv : new boolean[] {true, false}) { + for (Consumer method : methods) { + test(algo, provider, priv, method); + } + } + } + } + + if (failures > 0) { + throw new RuntimeException(failures + " test(s) failed."); + } + } + + static void test(String algo, Provider provider, boolean priv, + Consumer method) throws Exception { + KeyPairGenerator generator; + try { + generator = KeyPairGenerator.getInstance(algo, provider); + } catch (NoSuchAlgorithmException nsae) { + return; + } + + System.out.println("Checking " + provider.getName() + ", " + algo); + + KeyPair pair = generator.generateKeyPair(); + Key key = priv ? pair.getPrivate() : pair.getPublic(); + + pair = null; + for (int i = 0; i < 32; ++i) { + System.gc(); + } + + try { + method.accept(key); + } catch (ProviderException pe) { + failures++; + } + } +} From aacb739bbd84177a1a5272d32a5524e7205a2b24 Mon Sep 17 00:00:00 2001 From: Artem Smotrakov Date: Mon, 15 Aug 2016 16:32:41 -0700 Subject: [PATCH 067/115] 8162484: javax/net/ssl/Stapling/SSLSocketWithStapling.java test fails intermittently with "Address already in use" error Reviewed-by: xuelei, jnimeh --- .../testlibrary/SimpleOCSPServer.java | 45 +++++++++--- .../ssl/Stapling/SSLSocketWithStapling.java | 72 ++++++++----------- 2 files changed, 67 insertions(+), 50 deletions(-) diff --git a/jdk/test/java/security/testlibrary/SimpleOCSPServer.java b/jdk/test/java/security/testlibrary/SimpleOCSPServer.java index 77b8bb44642..4901e6f2651 100644 --- a/jdk/test/java/security/testlibrary/SimpleOCSPServer.java +++ b/jdk/test/java/security/testlibrary/SimpleOCSPServer.java @@ -64,6 +64,8 @@ public class SimpleOCSPServer { private static final SimpleDateFormat utcDateFmt = new SimpleDateFormat("MMM dd yyyy, HH:mm:ss z"); + static final int FREE_PORT = 0; + // CertStatus values public static enum CertStatus { CERT_STATUS_GOOD, @@ -88,7 +90,8 @@ public class SimpleOCSPServer { private volatile boolean started = false; private volatile boolean serverReady = false; private volatile boolean receivedShutdown = false; - private long delayMsec = 0; + private volatile boolean acceptConnections = true; + private volatile long delayMsec = 0; // Fields used in the generation of responses private long nextUpdateInterval = -1; @@ -116,7 +119,7 @@ public class SimpleOCSPServer { */ public SimpleOCSPServer(KeyStore ks, String password, String issuerAlias, String signerAlias) throws GeneralSecurityException, IOException { - this(null, 0, ks, password, issuerAlias, signerAlias); + this(null, FREE_PORT, ks, password, issuerAlias, signerAlias); } /** @@ -230,6 +233,15 @@ public class SimpleOCSPServer { while (!receivedShutdown) { try { Socket newConnection = servSocket.accept(); + if (!acceptConnections) { + try { + log("Reject connection"); + newConnection.close(); + } catch (IOException e) { + // ignore + } + continue; + } threadPool.submit(new OcspHandler(newConnection)); } catch (SocketTimeoutException timeout) { // Nothing to do here. If receivedShutdown @@ -256,6 +268,23 @@ public class SimpleOCSPServer { }); } + /** + * Make the OCSP server reject incoming connections. + */ + public synchronized void rejectConnections() { + log("Reject OCSP connections"); + acceptConnections = false; + } + + /** + * Make the OCSP server accept incoming connections. + */ + public synchronized void acceptConnections() { + log("Accept OCSP connections"); + acceptConnections = true; + } + + /** * Stop the OCSP server. */ @@ -499,13 +528,11 @@ public class SimpleOCSPServer { * on the incoming request. */ public void setDelay(long delayMillis) { - if (!started) { - delayMsec = delayMillis > 0 ? delayMillis : 0; - if (delayMsec > 0) { - log("OCSP latency set to " + delayMsec + " milliseconds."); - } else { - log("OCSP latency disabled"); - } + delayMsec = delayMillis > 0 ? delayMillis : 0; + if (delayMsec > 0) { + log("OCSP latency set to " + delayMsec + " milliseconds."); + } else { + log("OCSP latency disabled"); } } diff --git a/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java b/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java index f1e5f1da945..aaa8ce35396 100644 --- a/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java +++ b/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java @@ -119,20 +119,22 @@ public class SSLSocketWithStapling { System.setProperty("javax.net.debug", "ssl"); } - // Create the PKI we will use for the test and start the OCSP servers - createPKI(); + try { + // Create the PKI we will use for the test and start the OCSP servers + createPKI(); - testAllDefault(); - testPKIXParametersRevEnabled(); - testRevokedCertificate(); - testHardFailFallback(); - testSoftFailFallback(); - testLatencyNoStaple(false); - testLatencyNoStaple(true); - - // shut down the OCSP responders before finishing the test - intOcsp.stop(); - rootOcsp.stop(); + testAllDefault(); + testPKIXParametersRevEnabled(); + testRevokedCertificate(); + testHardFailFallback(); + testSoftFailFallback(); + testLatencyNoStaple(false); + testLatencyNoStaple(true); + } finally { + // shut down the OCSP responders before finishing the test + intOcsp.stop(); + rootOcsp.stop(); + } } /** @@ -281,11 +283,9 @@ public class SSLSocketWithStapling { ServerParameters servParams = new ServerParameters(); serverReady = false; - // Stop the OCSP responders and give a 1 second delay before - // running the test. - intOcsp.stop(); - rootOcsp.stop(); - Thread.sleep(1000); + // make OCSP responders reject connections + intOcsp.rejectConnections(); + rootOcsp.rejectConnections(); System.out.println("======================================="); System.out.println("Stapling enbled in client and server,"); @@ -315,9 +315,9 @@ public class SSLSocketWithStapling { System.out.println(" PASS"); System.out.println("=======================================\n"); - // Start the OCSP responders up again - intOcsp.start(); - rootOcsp.start(); + // Make OCSP responders accept connections + intOcsp.acceptConnections(); + rootOcsp.acceptConnections(); // Wait 5 seconds for server ready for (int i = 0; (i < 100 && (!intOcsp.isServerReady() || !rootOcsp.isServerReady())); i++) { @@ -338,11 +338,9 @@ public class SSLSocketWithStapling { ServerParameters servParams = new ServerParameters(); serverReady = false; - // Stop the OCSP responders and give a 1 second delay before - // running the test. - intOcsp.stop(); - rootOcsp.stop(); - Thread.sleep(1000); + // make OCSP responders reject connections + intOcsp.rejectConnections(); + rootOcsp.rejectConnections(); System.out.println("======================================="); System.out.println("Stapling enbled in client and server,"); @@ -372,9 +370,9 @@ public class SSLSocketWithStapling { System.out.println(" PASS"); System.out.println("=======================================\n"); - // Start the OCSP responders up again - intOcsp.start(); - rootOcsp.start(); + // Make OCSP responders accept connections + intOcsp.acceptConnections(); + rootOcsp.acceptConnections(); // Wait 5 seconds for server ready for (int i = 0; (i < 100 && (!intOcsp.isServerReady() || !rootOcsp.isServerReady())); i++) { @@ -401,15 +399,10 @@ public class SSLSocketWithStapling { ServerParameters servParams = new ServerParameters(); serverReady = false; - // Stop the OCSP responders and give a 1 second delay before - // running the test. - intOcsp.stop(); - rootOcsp.stop(); - Thread.sleep(1000); + // Give a 1 second delay before running the test. intOcsp.setDelay(3000); rootOcsp.setDelay(3000); - rootOcsp.start(); - intOcsp.start(); + Thread.sleep(1000); // Wait 5 seconds for server ready for (int i = 0; (i < 100 && (!intOcsp.isServerReady() || !rootOcsp.isServerReady())); i++) { @@ -458,13 +451,9 @@ public class SSLSocketWithStapling { System.out.println("========================================\n"); // Remove the OCSP responder latency - intOcsp.stop(); - rootOcsp.stop(); - Thread.sleep(1000); intOcsp.setDelay(0); rootOcsp.setDelay(0); - rootOcsp.start(); - intOcsp.start(); + Thread.sleep(1000); // Wait 5 seconds for server ready for (int i = 0; (i < 100 && (!intOcsp.isServerReady() || !rootOcsp.isServerReady())); i++) { @@ -676,6 +665,7 @@ public class SSLSocketWithStapling { * Release the client, if not active already... */ System.err.println("Server died..."); + e.printStackTrace(System.err); serverReady = true; serverException = e; } From 10179e0d9b6790ad5a359ded699985f52025e170 Mon Sep 17 00:00:00 2001 From: Nishit Jain Date: Tue, 16 Aug 2016 15:26:41 +0900 Subject: [PATCH 068/115] 8129555: DateFormatSymbols: month-related methods must refer to Calendar constants Reviewed-by: naoto, okutsu, peytoia --- .../classes/java/text/DateFormatSymbols.java | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java b/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java index 5284bcd3907..0c9b50ae152 100644 --- a/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java +++ b/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java @@ -399,7 +399,10 @@ public class DateFormatSymbols implements Serializable, Cloneable { * Calendar Elements in the Unicode Locale Data Markup Language * (LDML) specification for more details. * - * @return the month strings. + * @return the month strings. Use + * {@link java.util.Calendar#JANUARY Calendar.JANUARY}, + * {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, + * etc. to index the result array. */ public String[] getMonths() { return Arrays.copyOf(months, months.length); @@ -407,7 +410,9 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Sets month strings. For example: "January", "February", etc. - * @param newMonths the new month strings. + * @param newMonths the new month strings. The array should + * be indexed by {@link java.util.Calendar#JANUARY Calendar.JANUARY}, + * {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, etc. */ public void setMonths(String[] newMonths) { months = Arrays.copyOf(newMonths, newMonths.length); @@ -427,7 +432,10 @@ public class DateFormatSymbols implements Serializable, Cloneable { * Calendar Elements in the Unicode Locale Data Markup Language * (LDML) specification for more details. * - * @return the short month strings. + * @return the short month strings. Use + * {@link java.util.Calendar#JANUARY Calendar.JANUARY}, + * {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, + * etc. to index the result array. */ public String[] getShortMonths() { return Arrays.copyOf(shortMonths, shortMonths.length); @@ -435,7 +443,9 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Sets short month strings. For example: "Jan", "Feb", etc. - * @param newShortMonths the new short month strings. + * @param newShortMonths the new short month strings. The array should + * be indexed by {@link java.util.Calendar#JANUARY Calendar.JANUARY}, + * {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, etc. */ public void setShortMonths(String[] newShortMonths) { shortMonths = Arrays.copyOf(newShortMonths, newShortMonths.length); @@ -444,8 +454,10 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Gets weekday strings. For example: "Sunday", "Monday", etc. - * @return the weekday strings. Use Calendar.SUNDAY, - * Calendar.MONDAY, etc. to index the result array. + * @return the weekday strings. Use + * {@link java.util.Calendar#SUNDAY Calendar.SUNDAY}, + * {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. to index + * the result array. */ public String[] getWeekdays() { return Arrays.copyOf(weekdays, weekdays.length); @@ -454,8 +466,8 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Sets weekday strings. For example: "Sunday", "Monday", etc. * @param newWeekdays the new weekday strings. The array should - * be indexed by Calendar.SUNDAY, - * Calendar.MONDAY, etc. + * be indexed by {@link java.util.Calendar#SUNDAY Calendar.SUNDAY}, + * {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. */ public void setWeekdays(String[] newWeekdays) { weekdays = Arrays.copyOf(newWeekdays, newWeekdays.length); @@ -464,8 +476,10 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Gets short weekday strings. For example: "Sun", "Mon", etc. - * @return the short weekday strings. Use Calendar.SUNDAY, - * Calendar.MONDAY, etc. to index the result array. + * @return the short weekday strings. Use + * {@link java.util.Calendar#SUNDAY Calendar.SUNDAY}, + * {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. to index + * the result array. */ public String[] getShortWeekdays() { return Arrays.copyOf(shortWeekdays, shortWeekdays.length); @@ -474,8 +488,8 @@ public class DateFormatSymbols implements Serializable, Cloneable { /** * Sets short weekday strings. For example: "Sun", "Mon", etc. * @param newShortWeekdays the new short weekday strings. The array should - * be indexed by Calendar.SUNDAY, - * Calendar.MONDAY, etc. + * be indexed by {@link java.util.Calendar#SUNDAY Calendar.SUNDAY}, + * {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. */ public void setShortWeekdays(String[] newShortWeekdays) { shortWeekdays = Arrays.copyOf(newShortWeekdays, newShortWeekdays.length); From ca2024b93f9d364910e71e238268db0f558e25d1 Mon Sep 17 00:00:00 2001 From: Sibabrata Sahoo Date: Tue, 16 Aug 2016 12:34:00 +0530 Subject: [PATCH 069/115] 8159964: Update Tests to verify JDK build for "JDK-8159488 Deprivilege java.xml.crypto" Reviewed-by: valeriep --- .../DeprivilegedModuleLoaderTest.java | 90 +++++++++++++++++++ .../dsig/TransformService/NullParent.java | 1 + .../crypto/dsig/TransformService/test.policy | 3 + .../crypto/dsig/keyinfo/KeyInfo/Marshal.java | 2 +- .../crypto/dsig/keyinfo/KeyInfo/test.policy | 3 + 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 jdk/test/java/security/Security/ClassLoader/DeprivilegedModuleLoaderTest.java create mode 100644 jdk/test/javax/xml/crypto/dsig/TransformService/test.policy create mode 100644 jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/test.policy diff --git a/jdk/test/java/security/Security/ClassLoader/DeprivilegedModuleLoaderTest.java b/jdk/test/java/security/Security/ClassLoader/DeprivilegedModuleLoaderTest.java new file mode 100644 index 00000000000..b12259b6833 --- /dev/null +++ b/jdk/test/java/security/Security/ClassLoader/DeprivilegedModuleLoaderTest.java @@ -0,0 +1,90 @@ +/* + * 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.File; +import java.util.ArrayList; +import java.util.List; +import javax.security.auth.kerberos.KeyTab; +import javax.xml.crypto.KeySelectorException; +import javax.xml.crypto.dsig.XMLSignatureFactory; +import com.sun.security.auth.callback.TextCallbackHandler; +import com.sun.security.jgss.AuthorizationDataEntry; + +/* + * @test + * @bug 8159964 + * @summary Classes from deprivileged modules should get loaded through + * Platform Classloader. + * @run main DeprivilegedModuleLoaderTest + */ +public class DeprivilegedModuleLoaderTest { + + public static void main(String[] args) { + + boolean pass = true; + List> classes = getDeprivilegedClasses(); + for (Class cls : classes) { + try { + pass &= testPlatformClassLoader(cls); + } catch (Exception exc) { + exc.printStackTrace(System.out); + pass = false; + } + } + + if (!pass) { + throw new RuntimeException("Atleast one test failed."); + } + } + + private static List> getDeprivilegedClasses() { + + List> classes = new ArrayList>(); + // Test from java.xml.crypto/javax/xml/crypto/dsig package + classes.add(XMLSignatureFactory.class); + // Test from java.xml.crypto/javax/xml/crypto package + classes.add(KeySelectorException.class); + // Test From java.security.jgss/javax/security/auth/kerberos package + classes.add(KeyTab.class); + // Test from jdk.security.jgss/com/sun/security/jgss package + classes.add(AuthorizationDataEntry.class); + // Test from jdk.security.auth/com/sun/security/auth/callback package + classes.add(TextCallbackHandler.class); + return classes; + } + + private static boolean testPlatformClassLoader(Class cls) { + + ClassLoader loader = cls.getClassLoader(); + if (loader == null) { + throw new RuntimeException(String.format( + "Loaded through Bootstrap Classloader: '%s'", cls)); + } else if (!loader.toString().contains("PlatformClassLoader")) { + throw new RuntimeException(String.format( + "Not loaded through Platform ClassLoader: '%s'", cls)); + } + System.out.println(String.format( + "Pass: '%s' get loaded through PlatformClassLoader", cls)); + return true; + } +} diff --git a/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java b/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java index 79c03174d20..1205cce8beb 100644 --- a/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java @@ -26,6 +26,7 @@ * @bug 8022120 * @summary check that the init and marshalParams methods throw * NullPointerException when the parent parameter is null + * @run main/othervm/java.security.policy==test.policy NullParent */ import javax.xml.crypto.dsig.CanonicalizationMethod; diff --git a/jdk/test/javax/xml/crypto/dsig/TransformService/test.policy b/jdk/test/javax/xml/crypto/dsig/TransformService/test.policy new file mode 100644 index 00000000000..ccc41e5f1ab --- /dev/null +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/test.policy @@ -0,0 +1,3 @@ +grant { + +}; diff --git a/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/Marshal.java b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/Marshal.java index f03cbf3ac99..159fc4ef627 100644 --- a/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/Marshal.java +++ b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/Marshal.java @@ -27,7 +27,7 @@ * @summary Test that KeyInfo.marshal works correctly * @modules java.xml.crypto/org.jcp.xml.dsig.internal.dom * @compile -XDignore.symbol.file Marshal.java - * @run main Marshal + * @run main/othervm/java.security.policy==test.policy Marshal * @author Sean Mullan */ diff --git a/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/test.policy b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/test.policy new file mode 100644 index 00000000000..a6a4709bbae --- /dev/null +++ b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfo/test.policy @@ -0,0 +1,3 @@ +grant { + permission java.lang.RuntimePermission "accessClassInPackage.org.jcp.xml.dsig.internal.dom"; +}; From a283244f8677a6faa9989f8c5021dec439a9279d Mon Sep 17 00:00:00 2001 From: Staffan Larsen Date: Tue, 16 Aug 2016 09:57:50 +0200 Subject: [PATCH 070/115] 8164012: com/sun/jdi/CatchPatternTest.sh fails on jdk9/hs with Required output "Exception occurred: java.lang.IllegalMonitorStateException" not found Change test so that irrelevant exceptions do not interfere Reviewed-by: dholmes, dsamersoff --- jdk/test/com/sun/jdi/CatchPatternTest.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jdk/test/com/sun/jdi/CatchPatternTest.sh b/jdk/test/com/sun/jdi/CatchPatternTest.sh index 1164b74b94d..0a45b388a4d 100644 --- a/jdk/test/com/sun/jdi/CatchPatternTest.sh +++ b/jdk/test/com/sun/jdi/CatchPatternTest.sh @@ -87,7 +87,12 @@ dojdbCmds() cmd stop in ${classname}.partTwo runToBkpt cmd ignore uncaught java.lang.Throwable - cmd catch all java.lang.I* + # Instead of matching java.lang.I* we use two more specific + # patterns here. The reason is to avoid matching IncompatibleClassChangeError + # (or the subclass NoSuchMethodError) thrown by the + # java.lang.invoke infrastructure. + cmd catch all java.lang.Il* + cmd catch all java.lang.Ind* cmd cont cmd cont cmd cont From 85a2347cb51575542979d4ee9a8663310dd7726f Mon Sep 17 00:00:00 2001 From: Dmitry Markov Date: Tue, 16 Aug 2016 11:13:46 +0300 Subject: [PATCH 071/115] 8163583: [macosx] Press "To Back" button on the Dialog,the Dialog moves behind the Frame Reviewed-by: serb --- .../native/libawt_lwawt/awt/AWTWindow.m | 22 +++++++++++++++++++ .../awt/Modal/ToBack/ToBackModeless5Test.java | 2 +- .../awt/Modal/ToBack/ToBackModeless6Test.java | 2 +- .../awt/Modal/ToBack/ToBackNonModal5Test.java | 2 +- .../awt/Modal/ToBack/ToBackNonModal6Test.java | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m index 7a385a65adb..682769ac2d2 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m @@ -807,6 +807,18 @@ AWT_ASSERT_APPKIT_THREAD; - (void)sendEvent:(NSEvent *)event { if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) { + // Move parent windows to front and make sure that a child window is displayed + // in front of its nearest parent. + if (self.ownerWindow != nil) { + JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; + jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; + if (platformWindow != NULL) { + static JNF_MEMBER_CACHE(jm_orderAboveSiblings, jc_CPlatformWindow, "orderAboveSiblings", "()V"); + JNFCallVoidMethod(env,platformWindow, jm_orderAboveSiblings); + (*env)->DeleteLocalRef(env, platformWindow); + } + } + [self orderChildWindows:YES]; NSPoint p = [NSEvent mouseLocation]; NSRect frame = [self.nsWindow frame]; @@ -1159,6 +1171,16 @@ JNF_COCOA_ENTER(env); NSWindow *nsWindow = OBJC(windowPtr); [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ [nsWindow orderBack:nil]; + // Order parent windows + AWTWindow *awtWindow = (AWTWindow*)[nsWindow delegate]; + while (awtWindow.ownerWindow != nil) { + awtWindow = awtWindow.ownerWindow; + if ([AWTWindow isJavaPlatformWindowVisible:awtWindow.nsWindow]) { + [awtWindow.nsWindow orderBack:nil]; + } + } + // Order child windows + [(AWTWindow*)[nsWindow delegate] orderChildWindows:NO]; }]; JNF_COCOA_EXIT(env); diff --git a/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java b/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java index 950418bc3ce..fd82879341e 100644 --- a/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java +++ b/jdk/test/java/awt/Modal/ToBack/ToBackModeless5Test.java @@ -26,7 +26,7 @@ import java.awt.Dialog; /* * @test * @key headful - * @bug 8054143 + * @bug 8054143 8163583 * @summary Check if toBack method works correctly for a modeless dialog * having a visible Frame constructor. * diff --git a/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java b/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java index df56012a029..e5115463a33 100644 --- a/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java +++ b/jdk/test/java/awt/Modal/ToBack/ToBackModeless6Test.java @@ -26,7 +26,7 @@ import java.awt.Dialog; /* * @test * @key headful - * @bug 8054143 + * @bug 8054143 8163583 * @summary Check if toBack method works correctly for a modeless dialog * having a visible Dialog constructor. * diff --git a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java index c3fac48e66e..9ba888d1308 100644 --- a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java +++ b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal5Test.java @@ -25,7 +25,7 @@ /* * @test * @key headful - * @bug 8054143 + * @bug 8054143 8163583 * @summary Check if toBack method works correctly for a non-modal dialog * having a visible Frame constructor. * diff --git a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java index dda242073c7..862e99e1425 100644 --- a/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java +++ b/jdk/test/java/awt/Modal/ToBack/ToBackNonModal6Test.java @@ -25,7 +25,7 @@ /* * @test * @key headful - * @bug 8054143 + * @bug 8054143 8163583 * @summary Check if toBack method works correctly for a non-modal dialog * having a visible Dialog constructor. * From 8e560dc22e4ebc4bbc9c5cce344f3d895901af33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Tue, 16 Aug 2016 15:04:51 +0200 Subject: [PATCH 072/115] 8163945: Honor Number type hint in toPrimitive on Numbers Reviewed-by: jlaskey, mhaupt --- .../jdk/nashorn/internal/runtime/JSType.java | 2 + nashorn/test/script/basic/JDK-8163945.js | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 nashorn/test/script/basic/JDK-8163945.js diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java index 879bf91bb55..1e180ae1e59 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java @@ -474,6 +474,8 @@ public enum JSType { return toPrimitive((ScriptObject)obj, hint); } else if (isPrimitive(obj)) { return obj; + } else if (hint == Number.class && obj instanceof Number) { + return ((Number) obj).doubleValue(); } else if (obj instanceof JSObject) { return toPrimitive((JSObject)obj, hint); } else if (obj instanceof StaticClass) { diff --git a/nashorn/test/script/basic/JDK-8163945.js b/nashorn/test/script/basic/JDK-8163945.js new file mode 100644 index 00000000000..781dd944c64 --- /dev/null +++ b/nashorn/test/script/basic/JDK-8163945.js @@ -0,0 +1,48 @@ +/* + * 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-8163945: Honor Number type hint in toPrimitive on Numbers + * + * @test + * @run + */ + +function assertLessThan(a, b) { + Assert.assertTrue(a < b); + Assert.assertTrue(a <= b); + Assert.assertFalse(a >= b); + Assert.assertFalse(a > b); +} + +assertLessThan(new java.lang.Long(2), new java.lang.Long(10)); +assertLessThan(new java.lang.Long(2), 10); +assertLessThan(2, new java.lang.Long(10)); + +assertLessThan(new java.math.BigInteger(2), new java.math.BigInteger(10)); +assertLessThan(new java.math.BigInteger(2), 10); +assertLessThan(2, new java.math.BigInteger(10)); + +assertLessThan(new java.util.concurrent.atomic.AtomicInteger(2), new java.util.concurrent.atomic.AtomicInteger(10)); +assertLessThan(new java.util.concurrent.atomic.AtomicInteger(2), 10); +assertLessThan(2, new java.util.concurrent.atomic.AtomicInteger(10)); From 68ec99774eac5730e53b3b3fd2f850c57b1b130f Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Tue, 16 Aug 2016 21:28:10 +0800 Subject: [PATCH 073/115] 8141411: keytool can wrongly parse the start date value given by the -startdate option Reviewed-by: xuelei --- .../sun/security/tools/keytool/Main.java | 4 +- .../security/tools/keytool/StartDateTest.java | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java index 12b5041ea41..6e26cc62128 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java @@ -3631,8 +3631,8 @@ public final class Main { if (time != null) { if (time.matches("\\d\\d:\\d\\d:\\d\\d")) { c.set(Calendar.HOUR_OF_DAY, Integer.valueOf(time.substring(0, 2))); - c.set(Calendar.MINUTE, Integer.valueOf(time.substring(0, 2))); - c.set(Calendar.SECOND, Integer.valueOf(time.substring(0, 2))); + c.set(Calendar.MINUTE, Integer.valueOf(time.substring(3, 5))); + c.set(Calendar.SECOND, Integer.valueOf(time.substring(6, 8))); c.set(Calendar.MILLISECOND, 0); } else { throw ioe; diff --git a/jdk/test/sun/security/tools/keytool/StartDateTest.java b/jdk/test/sun/security/tools/keytool/StartDateTest.java index a1180eac4f2..d558ff6a49f 100644 --- a/jdk/test/sun/security/tools/keytool/StartDateTest.java +++ b/jdk/test/sun/security/tools/keytool/StartDateTest.java @@ -49,23 +49,31 @@ public class StartDateTest { new File("jks").delete(); - run("-keystore jks -storetype jks -storepass changeit -keypass changeit -alias me " + - "-keyalg rsa -genkeypair -dname CN=Haha -startdate +1y"); - cal.setTime(getIssueDate()); + run("one", "+1y"); + cal.setTime(getIssueDate("one")); System.out.println(cal); if (cal.get(Calendar.YEAR) != year + 1) { throw new Exception("Function check #1 fails"); } - run("-keystore jks -storetype jks -storepass changeit -keypass changeit -alias me " + - "-selfcert -startdate +1m"); - cal.setTime(getIssueDate()); + run("two", "+1m"); + cal.setTime(getIssueDate("two")); System.out.println(cal); if (cal.get(Calendar.MONTH) != (month + 1) % 12) { throw new Exception("Function check #2 fails"); } - new File("jks").delete(); + run("three", "2009/10/11 12:34:56"); + cal.setTime(getIssueDate("three")); + System.out.println(cal); + if (cal.get(Calendar.YEAR) != 2009 || + cal.get(Calendar.MONTH) != Calendar.OCTOBER || + cal.get(Calendar.DAY_OF_MONTH) != 11 || + cal.get(Calendar.HOUR_OF_DAY) != 12 || + cal.get(Calendar.MINUTE) != 34 || + cal.get(Calendar.SECOND) != 56) { + throw new Exception("Function check #3 fails"); + } // Part 2: Test format Method m = sun.security.tools.keytool.Main.class.getDeclaredMethod( @@ -129,16 +137,23 @@ public class StartDateTest { } } - static void run(String s) throws Exception { - sun.security.tools.keytool.Main.main((s+" -debug").split(" ")); + // The keytool command line template, alias and startdate TBD + static String[] cmd = ("-alias tbd -startdate tbd -keystore jks " + + "-storetype jks -storepass changeit -keypass changeit " + + "-keyalg rsa -genkeypair -dname CN=Haha -debug").split(" "); + + static void run(String alias, String startDate) throws Exception { + cmd[1] = alias; + cmd[3] = startDate; + sun.security.tools.keytool.Main.main(cmd); } - static Date getIssueDate() throws Exception { + static Date getIssueDate(String alias) throws Exception { KeyStore ks = KeyStore.getInstance("jks"); try (FileInputStream fis = new FileInputStream("jks")) { ks.load(fis, "changeit".toCharArray()); } - X509Certificate cert = (X509Certificate)ks.getCertificate("me"); + X509Certificate cert = (X509Certificate)ks.getCertificate(alias); return cert.getNotBefore(); } } From 2a74c06b8d1ac67ec72746d91f3d5669268af552 Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Tue, 16 Aug 2016 09:56:18 -0400 Subject: [PATCH 074/115] 8030221: Checking for anonymous class should check for NULL as well as potential nesting Store the first non-anonymous class as the host when defining the anonymous class so don't need look for it later. Reviewed-by: dholmes, lfoltan --- hotspot/src/share/vm/prims/unsafe.cpp | 7 ++ hotspot/src/share/vm/runtime/reflection.cpp | 12 +-- hotspot/test/runtime/Unsafe/NestedUnsafe.java | 90 +++++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 hotspot/test/runtime/Unsafe/NestedUnsafe.java diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp index e129fbafc41..d7721ec5f55 100644 --- a/hotspot/src/share/vm/prims/unsafe.cpp +++ b/hotspot/src/share/vm/prims/unsafe.cpp @@ -861,6 +861,13 @@ Unsafe_DefineAnonymousClass_impl(JNIEnv *env, } const Klass* host_klass = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(host_class)); + + // Make sure it's the real host class, not another anonymous class. + while (host_klass != NULL && host_klass->is_instance_klass() && + InstanceKlass::cast(host_klass)->is_anonymous()) { + host_klass = InstanceKlass::cast(host_klass)->host_klass(); + } + // Primitive types have NULL Klass* fields in their java.lang.Class instances. if (host_klass == NULL) { THROW_0(vmSymbols::java_lang_IllegalArgumentException()); diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index 867c831a165..7b2753e516f 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -660,11 +660,13 @@ bool Reflection::verify_field_access(const Klass* current_class, } const Klass* host_class = current_class; - while (host_class->is_instance_klass() && - InstanceKlass::cast(host_class)->is_anonymous()) { - const Klass* next_host_class = InstanceKlass::cast(host_class)->host_klass(); - if (next_host_class == NULL) break; - host_class = next_host_class; + if (host_class->is_instance_klass() && + InstanceKlass::cast(host_class)->is_anonymous()) { + host_class = InstanceKlass::cast(host_class)->host_klass(); + assert(host_class != NULL, "Anonymous class has null host class"); + assert(!(host_class->is_instance_klass() && + InstanceKlass::cast(host_class)->is_anonymous()), + "host_class should not be anonymous"); } if (host_class == field_class) { return true; diff --git a/hotspot/test/runtime/Unsafe/NestedUnsafe.java b/hotspot/test/runtime/Unsafe/NestedUnsafe.java new file mode 100644 index 00000000000..f009d6dddd4 --- /dev/null +++ b/hotspot/test/runtime/Unsafe/NestedUnsafe.java @@ -0,0 +1,90 @@ +/* + * 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 + * @summary Creates an anonymous class inside of an anonymous class. + * @library /testlibrary + * @modules java.base/jdk.internal.misc + * java.compiler + * java.management + * @run main NestedUnsafe + */ + +import java.security.ProtectionDomain; +import java.io.InputStream; +import java.lang.*; +import jdk.test.lib.*; +import jdk.internal.misc.Unsafe; +import static jdk.test.lib.Asserts.*; + +// package p; + +public class NestedUnsafe { + // The String concatenation should create the nested anonymous class. + static byte klassbuf[] = InMemoryJavaCompiler.compile("TestClass", + "public class TestClass { " + + " public static void concat(String one, String two) throws Throwable { " + + " System.out.println(one + two);" + + " } } "); + + public static void main(String args[]) throws Exception { + Unsafe unsafe = Utils.getUnsafe(); + + Class klass = unsafe.defineAnonymousClass(NestedUnsafe.class, klassbuf, new Object[0]); + unsafe.ensureClassInitialized(klass); + Class[] cArgs = new Class[2]; + cArgs[0] = String.class; + cArgs[1] = String.class; + try { + klass.getMethod("concat", cArgs).invoke(null, "AA", "BB"); + } catch (Throwable ex) { + throw new RuntimeException("Exception: " + ex.toString()); + } + + // The anonymous class calls defineAnonymousClass creating a nested anonymous class. + byte klassbuf2[] = InMemoryJavaCompiler.compile("TestClass2", + "import jdk.internal.misc.Unsafe; " + + "public class TestClass2 { " + + " public static void doit() throws Throwable { " + + " Unsafe unsafe = jdk.internal.misc.Unsafe.getUnsafe(); " + + " Class klass2 = unsafe.defineAnonymousClass(TestClass2.class, NestedUnsafe.klassbuf, new Object[0]); " + + " unsafe.ensureClassInitialized(klass2); " + + " Class[] dArgs = new Class[2]; " + + " dArgs[0] = String.class; " + + " dArgs[1] = String.class; " + + " try { " + + " klass2.getMethod(\"concat\", dArgs).invoke(null, \"CC\", \"DD\"); " + + " } catch (Throwable ex) { " + + " throw new RuntimeException(\"Exception: \" + ex.toString()); " + + " } " + + "} } ", + "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED"); + Class klass2 = unsafe.defineAnonymousClass(NestedUnsafe.class, klassbuf2, new Object[0]); + try { + klass2.getMethod("doit").invoke(null); + } catch (Throwable ex) { + throw new RuntimeException("Exception: " + ex.toString()); + } + } +} From 8b6f2f072305e95fb217c964ee66cebb6537e4c9 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Wed, 17 Aug 2016 10:08:18 +0800 Subject: [PATCH 075/115] 8087144: sun/security/krb5/auto/MaxRetries.java fails with Retry count is -1 less 8153146: sun/security/krb5/auto/MaxRetries.java failed with timeout Reviewed-by: xuelei --- .../sun/security/krb5/auto/CommMatcher.java | 86 +++++++++++ .../sun/security/krb5/auto/MaxRetries.java | 133 +++++++++++++----- 2 files changed, 184 insertions(+), 35 deletions(-) create mode 100644 jdk/test/sun/security/krb5/auto/CommMatcher.java diff --git a/jdk/test/sun/security/krb5/auto/CommMatcher.java b/jdk/test/sun/security/krb5/auto/CommMatcher.java new file mode 100644 index 00000000000..1cfe25a5d4d --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/CommMatcher.java @@ -0,0 +1,86 @@ +/* + * 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.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Matches the krb5 debug output: + * >>> KDCCommunication: kdc=host UDP:11555, timeout=100,Attempt =1, #bytes=138 + * + * Example: + * CommMatcher cm = new CommMatcher(); + * cm.addPort(12345).addPort(23456); + * for (String line : debugOutput) { + * if (cm.match(line)) { + * println("KDC: %c, %s, Timeout: %d\n", + * cm.kdc(), cm.protocol(), cm.timeout()); + * } + * } + */ +public class CommMatcher { + + static final Pattern re = Pattern.compile( + ">>> KDCCommunication: kdc=\\S+ (TCP|UDP):(\\d+), " + + "timeout=(\\d+),Attempt\\s*=(\\d+)"); + + List kdcPorts = new ArrayList<>(); + Matcher matcher; + + /** + * Add KDC ports one by one. The 1st KDC will be 'a' in {@link #kdc()}, + * 2nd is 'b', etc, etc. + */ + public CommMatcher addPort(int port) { + if (port > 0) { + kdcPorts.add(port); + } else { + kdcPorts.clear(); + } + return this; + } + + public boolean match(String line) { + matcher = re.matcher(line); + return matcher.find(); + } + + public String protocol() { + return matcher.group(1); + } + + public char kdc() { + int port = Integer.parseInt(matcher.group(2)); + return (char)(kdcPorts.indexOf(port) + 'a'); + } + + public int timeout() { + return BadKdc.toSymbolicSec(Integer.parseInt(matcher.group(3))); + } + + public int attempt() { + return Integer.parseInt(matcher.group(4)); + } +} diff --git a/jdk/test/sun/security/krb5/auto/MaxRetries.java b/jdk/test/sun/security/krb5/auto/MaxRetries.java index d23cd1043b5..b732becd169 100644 --- a/jdk/test/sun/security/krb5/auto/MaxRetries.java +++ b/jdk/test/sun/security/krb5/auto/MaxRetries.java @@ -30,6 +30,7 @@ * @summary support max_retries in krb5.conf */ +import javax.security.auth.login.LoginException; import java.io.*; import java.net.DatagramSocket; import java.security.Security; @@ -37,46 +38,86 @@ import java.security.Security; public class MaxRetries { static int idlePort = -1; + static CommMatcher cm = new CommMatcher(); public static void main(String[] args) throws Exception { System.setProperty("sun.security.krb5.debug", "true"); - new OneKDC(null).writeJAASConf(); + OneKDC kdc = new OneKDC(null).writeJAASConf(); // An idle UDP socket to prevent PortUnreachableException DatagramSocket ds = new DatagramSocket(); idlePort = ds.getLocalPort(); + cm.addPort(idlePort); + cm.addPort(kdc.getPort()); + System.setProperty("java.security.krb5.conf", "alternative-krb5.conf"); - // For tryLast Security.setProperty("krb5.kdc.bad.policy", "trylast"); + + // We always make the real timeout to be 1 second + BadKdc.setRatio(0.25f); rewriteMaxRetries(4); - test1(4000, 6); // 1 1 1 1 2 2 - test1(4000, 2); // 2 2 + // Explanation: In this case, max_retries=4 and timeout=4s. + // For AS-REQ without preauth, we will see 4 4s timeout on kdc#1 + // ("a4" repeat 4 times), and one 4s timeout on kdc#2 ("b4"). For + // AS-REQ with preauth, one 4s timeout on kdc#2 (second "b4"). + // we tolerate 4 real timeout on kdc#2, so make it "(b4){2,6}". + test1("a4a4a4a4b4b4", "a4a4a4a4(b4){2,6}"); + test1("b4b4", "(b4){2,6}"); + + BadKdc.setRatio(1f); rewriteMaxRetries(1); - test1(1000, 3); // 1 2 2 - test1(1000, 2); // 2 2 + // Explanation: Since max_retries=1 only, we could fail in 1st or 2nd + // AS-REQ to kdc#2. + String actual = test1("a1b1b1", "(a1b1b1|a1b1x|a1b1b1x)"); + if (actual.endsWith("x")) { + // If 1st attempt fails, all bads are back available + test1("a1b1b1", "(a1b1b1|a1b1x|a1b1b1x)"); + } else { + test1("b1b1", "(b1b1|b1x|b1b1x)"); + } + BadKdc.setRatio(0.2f); rewriteMaxRetries(-1); - test1(5000, 4); // 1 1 2 2 - test1(5000, 2); // 2 2 + test1("a5a5a5b5b5", "a5a5a5(b5){2,4}"); + test1("b5b5", "(b5){2,4}"); - // For tryLess - Security.setProperty("krb5.kdc.bad.policy", "tryless:1," + BadKdc.toReal(5000)); + BadKdc.setRatio(0.25f); + Security.setProperty("krb5.kdc.bad.policy", + "tryless:1,1000"); rewriteMaxRetries(4); - test1(4000, 7); // 1 1 1 1 2 1 2 - test1(4000, 4); // 1 2 1 2 + test1("a4a4a4a4b4a4b4", "a4a4a4a4(b4){1,3}a4(b4){1,3}"); + test1("a4b4a4b4", "a4(b4){1,3}a4(b4){1,3}"); + BadKdc.setRatio(1f); rewriteMaxRetries(1); - test1(1000, 4); // 1 2 1 2 - test1(1000, 4); // 1 2 1 2 + actual = test1("a1b1a1b1", "(a1b1|a1b1x|a1b1a1b1|a1b1a1b1x)"); + if (actual.endsWith("x")) { + test1("a1b1a1b1", "(a1b1|a1b1x|a1b1a1b1|a1b1a1b1x)"); + } else { + test1("a1b1a1b1", "(a1b1|a1b1x|a1b1a1b1|a1b1a1b1x)"); + } + BadKdc.setRatio(.2f); rewriteMaxRetries(-1); - test1(5000, 5); // 1 1 2 1 2 - test1(5000, 4); // 1 2 1 2 + test1("a5a5a5b5a5b5", "a5a5a5(b5){1,2}a5(b5){1,2}"); + test1("a5b5a5b5", "a5(b5){1,2}a5(b5){1,2}"); + + BadKdc.setRatio(1f); + rewriteMaxRetries(2); + if (BadKdc.toReal(2000) > 1000) { + // Explanation: if timeout is longer than 1s in tryLess, + // we will see "a1" at 2nd kdc#1 access + test1("a2a2b2a1b2", "a2a2(b2){1,2}a1(b2){1,2}"); + } else { + test1("a2a2b2a2b2", "a2a2(b2){1,2}a2(b2){1,2}"); + } + + BadKdc.setRatio(1f); rewriteUdpPrefLimit(-1, -1); // default, no limit test2("UDP"); @@ -95,32 +136,52 @@ public class MaxRetries { /** * One round of test for max_retries and timeout. - * @param timeout the expected timeout - * @param count the expected total try + * + * @param exact the expected exact match, where no timeout + * happens for real KDCs + * @param relaxed the expected relaxed match, where some timeout + * could happen for real KDCs + * @return the actual result */ - private static void test1(int timeout, int count) throws Exception { - String timeoutTag = "timeout=" + BadKdc.toReal(timeout); + private static String test1(String exact, String relaxed) throws Exception { ByteArrayOutputStream bo = new ByteArrayOutputStream(); PrintStream oldout = System.out; System.setOut(new PrintStream(bo)); - Context c = Context.fromJAAS("client"); + boolean failed = false; + long start = System.nanoTime(); + try { + Context c = Context.fromJAAS("client"); + } catch (LoginException e) { + failed = true; + } System.setOut(oldout); String[] lines = new String(bo.toByteArray()).split("\n"); - System.out.println("----------------- TEST (" + timeout + "," + - count + ") -----------------"); + System.out.println("----------------- TEST (" + exact + + ") -----------------"); + + // Result, a series of timeout + kdc# + StringBuilder sb = new StringBuilder(); for (String line: lines) { - if (line.startsWith(">>> KDCCommunication")) { + if (cm.match(line)) { System.out.println(line); - if (line.indexOf(timeoutTag) < 0) { - throw new Exception("Wrong timeout value" + timeoutTag); - } - count--; + sb.append(cm.kdc()).append(cm.timeout()); } } - if (count != 0) { - throw new Exception("Retry count is " + count + " less"); + if (failed) { + sb.append("x"); } + System.out.println("Time: " + (System.nanoTime() - start) / 1000000000d); + String actual = sb.toString(); + System.out.println("Actual: " + actual); + if (actual.equals(exact)) { + System.out.println("Exact match: " + exact); + } else if (actual.matches(relaxed)) { + System.out.println("!!!! Tolerant match: " + relaxed); + } else { + throw new Exception("Match neither " + exact + " nor " + relaxed); + } + return actual; } /** @@ -138,11 +199,11 @@ public class MaxRetries { String[] lines = new String(bo.toByteArray()).split("\n"); System.out.println("----------------- TEST -----------------"); for (String line: lines) { - if (line.startsWith(">>> KDCCommunication")) { + if (cm.match(line)) { System.out.println(line); count--; - if (line.indexOf(proto) < 0) { - throw new Exception("Wrong timeout value"); + if (!cm.protocol().equals(proto)) { + throw new Exception("Wrong protocol value"); } } } @@ -165,6 +226,7 @@ public class MaxRetries { } if (s.startsWith("[realms]")) { // Reconfig global setting + fw.write("kdc_timeout = 5000\n"); if (global != -1) { fw.write("udp_preference_limit = " + global + "\n"); } @@ -183,7 +245,8 @@ public class MaxRetries { /** * Set max_retries and timeout value for realm. The global value is always - * 2 and 5000. + * 3 and 5000. + * * @param value max_retries and timeout/1000 for a realm, -1 means none. */ private static void rewriteMaxRetries(int value) throws Exception { @@ -196,7 +259,7 @@ public class MaxRetries { } if (s.startsWith("[realms]")) { // Reconfig global setting - fw.write("max_retries = 2\n"); + fw.write("max_retries = 3\n"); fw.write("kdc_timeout = " + BadKdc.toReal(5000) + "\n"); } else if (s.trim().startsWith("kdc = ")) { if (value != -1) { From f2cc9a63629603bd85af328cf5e0281ea1bd297c Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Wed, 17 Aug 2016 19:16:28 +0530 Subject: [PATCH 076/115] 8164216: Netbeans makefile for nashorn should use JDK_9 as platform Reviewed-by: jlaskey --- nashorn/make/nbproject/nbjdk.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nashorn/make/nbproject/nbjdk.properties b/nashorn/make/nbproject/nbjdk.properties index 8809e40bff4..9e40c8d300a 100644 --- a/nashorn/make/nbproject/nbjdk.properties +++ b/nashorn/make/nbproject/nbjdk.properties @@ -20,5 +20,5 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -nbjdk.active=JDK_1.8 +nbjdk.active=JDK_9 From aa2e613bc5828182b43c54b4b1070a8e3a40002f Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Wed, 17 Aug 2016 13:27:22 -0400 Subject: [PATCH 077/115] 8161965: Create initial javadoc description for modules Reviewed-by: mchung, alanb, abuckley --- corba/src/java.corba/share/classes/module-info.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/corba/src/java.corba/share/classes/module-info.java b/corba/src/java.corba/share/classes/module-info.java index 644e19c6f80..8c21cc30ca0 100644 --- a/corba/src/java.corba/share/classes/module-info.java +++ b/corba/src/java.corba/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API. + */ module java.corba { requires public java.desktop; requires public java.rmi; From b37267c86640cbb222ba8830c55f05a9e4eeda14 Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Wed, 17 Aug 2016 14:40:12 -0400 Subject: [PATCH 078/115] 8164071: Default.policy file missing content for solaris Reviewed-by: erikj --- jdk/make/copy/Copy-java.base.gmk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/make/copy/Copy-java.base.gmk b/jdk/make/copy/Copy-java.base.gmk index 5fb26d4b4d2..c023e8cfbed 100644 --- a/jdk/make/copy/Copy-java.base.gmk +++ b/jdk/make/copy/Copy-java.base.gmk @@ -183,7 +183,7 @@ DEF_POLICY_DST := $(LIB_DST_DIR)/security/default.policy DEF_POLICY_SRC_LIST := $(DEF_POLICY_SRC) -ifeq ($(OPENJDK_TARGET_OS), windows) +ifneq ($(filter $(OPENJDK_TARGET_OS), windows solaris), ) DEF_POLICY_SRC_LIST += $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/lib/security/default.policy endif From 5343687991fc80fc595f9b153ebd09bcd6d6e9f3 Mon Sep 17 00:00:00 2001 From: Vinnie Ryan Date: Wed, 17 Aug 2016 21:14:39 +0100 Subject: [PATCH 079/115] 6977937: The SunJCE PBKDF2KeyImpl is requiring the MAC instance also be from SunJCE Reviewed-by: xuelei, ascarpino, wetmore --- .../share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index 134a60096c2..87c3da39c8c 100644 --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -107,7 +107,7 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { throw new InvalidKeySpecException("Key length is negative"); } try { - this.prf = Mac.getInstance(prfAlgo, SunJCE.getInstance()); + this.prf = Mac.getInstance(prfAlgo); } catch (NoSuchAlgorithmException nsae) { // not gonna happen; re-throw just in case InvalidKeySpecException ike = new InvalidKeySpecException(); From 697ec31ecf5dea2a97b115bc436935e779150615 Mon Sep 17 00:00:00 2001 From: Anthony Scarpino Date: Wed, 17 Aug 2016 16:03:52 -0700 Subject: [PATCH 080/115] 8156192: Provider#compute and #merge methods expect wrong permission & #compute ClassCastException even with wrong permission Reviewed-by: mullan, jnimeh --- .../share/classes/java/security/Provider.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/security/Provider.java b/jdk/src/java.base/share/classes/java/security/Provider.java index f9b0583df84..1d9d072b700 100644 --- a/jdk/src/java.base/share/classes/java/security/Provider.java +++ b/jdk/src/java.base/share/classes/java/security/Provider.java @@ -601,7 +601,7 @@ public abstract class Provider extends Properties { public synchronized Object compute(Object key, BiFunction remappingFunction) { check("putProviderProperty." + name); - check("removeProviderProperty" + name); + check("removeProviderProperty." + name); if (debug != null) { debug.println("Compute " + name + " provider property " + key); @@ -632,7 +632,7 @@ public abstract class Provider extends Properties { public synchronized Object computeIfAbsent(Object key, Function mappingFunction) { check("putProviderProperty." + name); - check("removeProviderProperty" + name); + check("removeProviderProperty." + name); if (debug != null) { debug.println("ComputeIfAbsent " + name + " provider property " + @@ -662,7 +662,7 @@ public abstract class Provider extends Properties { public synchronized Object computeIfPresent(Object key, BiFunction remappingFunction) { check("putProviderProperty." + name); - check("removeProviderProperty" + name); + check("removeProviderProperty." + name); if (debug != null) { debug.println("ComputeIfPresent " + name + " provider property " + @@ -695,7 +695,7 @@ public abstract class Provider extends Properties { public synchronized Object merge(Object key, Object value, BiFunction remappingFunction) { check("putProviderProperty." + name); - check("removeProviderProperty" + name); + check("removeProviderProperty." + name); if (debug != null) { debug.println("Merge " + name + " provider property " + key); @@ -904,8 +904,8 @@ public abstract class Provider extends Properties { if (!checkLegacy(key)) { return null; } - legacyStrings.computeIfAbsent((String) key, - (Function) remappingFunction); + legacyStrings.compute((String) key, + (BiFunction) remappingFunction); } return super.compute(key, remappingFunction); } From a225cebefc1c8ce4c6cae6872b0d5aa224fe2955 Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Thu, 18 Aug 2016 16:54:27 +0530 Subject: [PATCH 081/115] 8164260: readLine does not echo characters Reviewed-by: jlaskey --- .../classes/jdk/nashorn/tools/jjs/Main.java | 11 +++++++ .../internal/runtime/ScriptingFunctions.java | 32 ++++++++++++++++--- .../jdk/nashorn/tools/ShellFunctions.java | 5 ++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java index af010065ed9..418bce95c85 100644 --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java @@ -34,6 +34,7 @@ import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; +import java.io.UncheckedIOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URI; @@ -50,6 +51,7 @@ import jdk.nashorn.internal.runtime.NativeJavaPackage; import jdk.nashorn.internal.runtime.Property; import jdk.nashorn.internal.runtime.ScriptEnvironment; import jdk.nashorn.internal.runtime.ScriptFunction; +import jdk.nashorn.internal.runtime.ScriptingFunctions; import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.tools.Shell; @@ -157,6 +159,15 @@ public final class Main extends Shell { global.addShellBuiltins(); + // redefine readLine to use jline Console's readLine! + ScriptingFunctions.setReadLineHelper(str-> { + try { + return in.readLine(str); + } catch (final IOException ioExp) { + throw new UncheckedIOException(ioExp); + } + }); + if (System.getSecurityManager() == null) { final Consumer evaluator = str -> { // could be called from different thread (GUI), we need to handle Context set/reset diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java index 42f17522656..b64c36c3fff 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java @@ -42,6 +42,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Function; import jdk.nashorn.internal.objects.NativeArray; import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError; @@ -92,11 +94,7 @@ public final class ScriptingFunctions { * @throws IOException if an exception occurs */ public static Object readLine(final Object self, final Object prompt) throws IOException { - if (prompt != UNDEFINED) { - System.out.print(JSType.toString(prompt)); - } - final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - return reader.readLine(); + return readLine(prompt); } /** @@ -219,6 +217,30 @@ public final class ScriptingFunctions { return outString; } + // Implementation for pluggable "readLine" functionality + // Used by jjs interactive mode + + private static Function readLineHelper; + + public static void setReadLineHelper(Function func) { + readLineHelper = Objects.requireNonNull(func); + } + + public static Function getReadLineHelper() { + return readLineHelper; + } + + public static String readLine(final Object prompt) throws IOException { + final String p = (prompt != UNDEFINED)? JSType.toString(prompt) : ""; + if (readLineHelper != null) { + return readLineHelper.apply(p); + } else { + System.out.print(p); + final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + return reader.readLine(); + } + } + private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) { return MH.findStatic(MethodHandles.lookup(), ScriptingFunctions.class, name, MH.type(rtype, types)); } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java index 6b3e1791357..2bf0964abc4 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java @@ -34,6 +34,7 @@ import java.io.InputStreamReader; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import jdk.nashorn.internal.runtime.JSType; +import jdk.nashorn.internal.runtime.ScriptingFunctions; import jdk.nashorn.internal.objects.Global; /** @@ -66,11 +67,9 @@ public final class ShellFunctions { public static Object input(final Object self, final Object endMarker, final Object prompt) throws IOException { final String endMarkerStr = (endMarker != UNDEFINED)? JSType.toString(endMarker) : ""; final String promptStr = (prompt != UNDEFINED)? JSType.toString(prompt) : ">> "; - final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); final StringBuilder buf = new StringBuilder(); while (true) { - System.out.print(promptStr); - final String line = reader.readLine(); + final String line = ScriptingFunctions.readLine(promptStr); if (line == null || line.equals(endMarkerStr)) { break; } From 004433bf70a814d9c8157328605eda7cf9b018b2 Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Thu, 18 Aug 2016 12:39:23 -0400 Subject: [PATCH 082/115] 8161965: Create initial javadoc description for modules Reviewed-by: mchung, alanb, abuckley --- jdk/src/java.base/share/classes/module-info.java | 3 +-- jdk/src/java.compact1/share/classes/module-info.java | 3 +++ jdk/src/java.compact2/share/classes/module-info.java | 3 +++ jdk/src/java.compact3/share/classes/module-info.java | 4 ++++ jdk/src/java.datatransfer/share/classes/module-info.java | 4 +--- jdk/src/java.desktop/share/classes/module-info.java | 6 +++--- jdk/src/java.httpclient/share/classes/module-info.java | 3 +++ jdk/src/java.instrument/share/classes/module-info.java | 4 ++++ jdk/src/java.logging/share/classes/module-info.java | 3 +++ jdk/src/java.management/share/classes/module-info.java | 6 ++++++ jdk/src/java.naming/share/classes/module-info.java | 3 +++ jdk/src/java.prefs/share/classes/module-info.java | 3 +++ jdk/src/java.rmi/share/classes/module-info.java | 3 +++ jdk/src/java.scripting/share/classes/module-info.java | 3 +++ jdk/src/java.se.ee/share/classes/module-info.java | 6 ++++++ jdk/src/java.se/share/classes/module-info.java | 7 +++++++ jdk/src/java.security.jgss/share/classes/module-info.java | 5 +++++ jdk/src/java.security.sasl/share/classes/module-info.java | 7 +++++++ jdk/src/java.smartcardio/share/classes/module-info.java | 3 +++ jdk/src/java.sql.rowset/share/classes/module-info.java | 3 +++ jdk/src/java.sql/share/classes/module-info.java | 3 +++ jdk/src/java.transaction/share/classes/module-info.java | 6 ++++++ jdk/src/java.xml.crypto/share/classes/module-info.java | 3 +++ 23 files changed, 86 insertions(+), 8 deletions(-) diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java index 044f43b2877..ae5ebbbb070 100644 --- a/jdk/src/java.base/share/classes/module-info.java +++ b/jdk/src/java.base/share/classes/module-info.java @@ -24,9 +24,8 @@ */ /** - * java.base defines and exports the core APIs of the Java SE platform. + * Defines the foundational APIs of the Java SE Platform. */ - module java.base { exports java.io; diff --git a/jdk/src/java.compact1/share/classes/module-info.java b/jdk/src/java.compact1/share/classes/module-info.java index 8c604682cd4..112c71b66e0 100644 --- a/jdk/src/java.compact1/share/classes/module-info.java +++ b/jdk/src/java.compact1/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Aggregates {@code java.base}, {@code java.logging}, and {@code java.scripting}. + */ module java.compact1 { requires public java.logging; requires public java.scripting; diff --git a/jdk/src/java.compact2/share/classes/module-info.java b/jdk/src/java.compact2/share/classes/module-info.java index 31a738dcd8b..b19902435d7 100644 --- a/jdk/src/java.compact2/share/classes/module-info.java +++ b/jdk/src/java.compact2/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Supplements {@code java.compact1} with JDBC, JAXP, and RMI. + */ module java.compact2 { requires public java.compact1; requires public java.rmi; diff --git a/jdk/src/java.compact3/share/classes/module-info.java b/jdk/src/java.compact3/share/classes/module-info.java index cbc67be6319..05f33c0da0e 100644 --- a/jdk/src/java.compact3/share/classes/module-info.java +++ b/jdk/src/java.compact3/share/classes/module-info.java @@ -23,6 +23,10 @@ * questions. */ +/** + * Supplements {@code java.compact2} with JDBC RowSet, JMX, JNDI, Compiler, + * Instrumentation, Preferences, Security, and XML cryptography APIs. + */ module java.compact3 { requires public java.compact2; requires public java.compiler; diff --git a/jdk/src/java.datatransfer/share/classes/module-info.java b/jdk/src/java.datatransfer/share/classes/module-info.java index 2a19571e3b4..ea3f9c2a53c 100644 --- a/jdk/src/java.datatransfer/share/classes/module-info.java +++ b/jdk/src/java.datatransfer/share/classes/module-info.java @@ -24,10 +24,8 @@ */ /** - * Provides interfaces and classes for transferring data between and - * within applications. + * Defines an API for transferring data between and within applications. */ - module java.datatransfer { exports java.awt.datatransfer; exports sun.datatransfer to java.desktop; diff --git a/jdk/src/java.desktop/share/classes/module-info.java b/jdk/src/java.desktop/share/classes/module-info.java index 504c0c25451..93ab9a46aa2 100644 --- a/jdk/src/java.desktop/share/classes/module-info.java +++ b/jdk/src/java.desktop/share/classes/module-info.java @@ -24,9 +24,9 @@ */ /** - * java.desktop defines and exports the user interface, graphics - * and imaging APIs of the Java SE platform. - */ + * Defines the AWT and Swing user interface toolkits, plus APIs for + * accessibility, audio, imaging, printing, and JavaBeans. + */ module java.desktop { requires public java.datatransfer; requires public java.xml; diff --git a/jdk/src/java.httpclient/share/classes/module-info.java b/jdk/src/java.httpclient/share/classes/module-info.java index 5adf7f6e5b2..f24416d1dfb 100644 --- a/jdk/src/java.httpclient/share/classes/module-info.java +++ b/jdk/src/java.httpclient/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the high-level HTTP and WebSocket API. + */ module java.httpclient { requires java.base; exports java.net.http; diff --git a/jdk/src/java.instrument/share/classes/module-info.java b/jdk/src/java.instrument/share/classes/module-info.java index 3eb704c6eab..27587d2c250 100644 --- a/jdk/src/java.instrument/share/classes/module-info.java +++ b/jdk/src/java.instrument/share/classes/module-info.java @@ -23,6 +23,10 @@ * questions. */ +/** + * Defines services that allow agents to + * instrument programs running on the JVM. + */ module java.instrument { exports java.lang.instrument; } diff --git a/jdk/src/java.logging/share/classes/module-info.java b/jdk/src/java.logging/share/classes/module-info.java index 47456e5ef5b..293d3873da1 100644 --- a/jdk/src/java.logging/share/classes/module-info.java +++ b/jdk/src/java.logging/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Java Logging API. + */ module java.logging { exports java.util.logging; provides jdk.internal.logger.DefaultLoggerFinder with diff --git a/jdk/src/java.management/share/classes/module-info.java b/jdk/src/java.management/share/classes/module-info.java index 8f7bd1b909e..6772da9d8ee 100644 --- a/jdk/src/java.management/share/classes/module-info.java +++ b/jdk/src/java.management/share/classes/module-info.java @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the Java Management Extensions (JMX) API. + *

+ * The JMX API consists of interfaces for monitoring and management of the + * JVM and other components in the Java runtime. + */ module java.management { requires public java.rmi; requires java.logging; diff --git a/jdk/src/java.naming/share/classes/module-info.java b/jdk/src/java.naming/share/classes/module-info.java index fb2e1018d76..b8964699610 100644 --- a/jdk/src/java.naming/share/classes/module-info.java +++ b/jdk/src/java.naming/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Java Naming and Directory Interface (JNDI) API. + */ module java.naming { requires java.security.sasl; diff --git a/jdk/src/java.prefs/share/classes/module-info.java b/jdk/src/java.prefs/share/classes/module-info.java index 3556b8eb395..4826cd2241b 100644 --- a/jdk/src/java.prefs/share/classes/module-info.java +++ b/jdk/src/java.prefs/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Preferences API. + */ module java.prefs { requires java.xml; diff --git a/jdk/src/java.rmi/share/classes/module-info.java b/jdk/src/java.rmi/share/classes/module-info.java index 44bd7288ca2..76195b6ec81 100644 --- a/jdk/src/java.rmi/share/classes/module-info.java +++ b/jdk/src/java.rmi/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Remote Method Invocation (RMI) API. + */ module java.rmi { requires java.logging; diff --git a/jdk/src/java.scripting/share/classes/module-info.java b/jdk/src/java.scripting/share/classes/module-info.java index b713ad0873b..b0a5baffc39 100644 --- a/jdk/src/java.scripting/share/classes/module-info.java +++ b/jdk/src/java.scripting/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Scripting API. + */ module java.scripting { exports javax.script; uses javax.script.ScriptEngineFactory; diff --git a/jdk/src/java.se.ee/share/classes/module-info.java b/jdk/src/java.se.ee/share/classes/module-info.java index 6d4a11fc70a..d611f5ef522 100644 --- a/jdk/src/java.se.ee/share/classes/module-info.java +++ b/jdk/src/java.se.ee/share/classes/module-info.java @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the full API of the Java SE Platform. + *

+ * This module requires {@code java.se} and supplements it with modules + * that define CORBA and Java EE APIs. These modules are upgradeable. + */ module java.se.ee { requires public java.se; diff --git a/jdk/src/java.se/share/classes/module-info.java b/jdk/src/java.se/share/classes/module-info.java index 73d5d05c093..26aeb030675 100644 --- a/jdk/src/java.se/share/classes/module-info.java +++ b/jdk/src/java.se/share/classes/module-info.java @@ -23,6 +23,13 @@ * questions. */ +/** + * Defines the core Java SE API. + *

+ * The modules defining + * CORBA and Java EE APIs are not required by this module, but they are + * required by {@code java.se.ee}. + */ module java.se { requires public java.compact3; requires public java.datatransfer; diff --git a/jdk/src/java.security.jgss/share/classes/module-info.java b/jdk/src/java.security.jgss/share/classes/module-info.java index 0a1e6c02f7c..6380721852c 100644 --- a/jdk/src/java.security.jgss/share/classes/module-info.java +++ b/jdk/src/java.security.jgss/share/classes/module-info.java @@ -23,6 +23,11 @@ * questions. */ +/** + * Defines the Java binding of the IETF Generic Security Services API (GSS-API). + *

+ * This module also contains GSS-API mechanisms including Kerberos v5 and SPNEGO. + */ module java.security.jgss { requires java.naming; exports javax.security.auth.kerberos; diff --git a/jdk/src/java.security.sasl/share/classes/module-info.java b/jdk/src/java.security.sasl/share/classes/module-info.java index ca06592ac70..70f860b3ce9 100644 --- a/jdk/src/java.security.sasl/share/classes/module-info.java +++ b/jdk/src/java.security.sasl/share/classes/module-info.java @@ -23,6 +23,13 @@ * questions. */ +/** + * Defines Java support for the IETF Simple Authentication and Security Layer + * (SASL). + *

+ * This module also contains SASL mechanisms including DIGEST-MD5, + * CRAM-MD5, and NTLM. + */ module java.security.sasl { requires java.logging; diff --git a/jdk/src/java.smartcardio/share/classes/module-info.java b/jdk/src/java.smartcardio/share/classes/module-info.java index 18f39988cc8..05f4588cbf6 100644 --- a/jdk/src/java.smartcardio/share/classes/module-info.java +++ b/jdk/src/java.smartcardio/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the Java Smart Card I/O API. + */ module java.smartcardio { exports javax.smartcardio; provides java.security.Provider with sun.security.smartcardio.SunPCSC; diff --git a/jdk/src/java.sql.rowset/share/classes/module-info.java b/jdk/src/java.sql.rowset/share/classes/module-info.java index a1cd9ce5772..8d24418b6f2 100644 --- a/jdk/src/java.sql.rowset/share/classes/module-info.java +++ b/jdk/src/java.sql.rowset/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the JDBC RowSet API. + */ module java.sql.rowset { requires public java.logging; requires public java.naming; diff --git a/jdk/src/java.sql/share/classes/module-info.java b/jdk/src/java.sql/share/classes/module-info.java index 30683d94b06..70764a06d73 100644 --- a/jdk/src/java.sql/share/classes/module-info.java +++ b/jdk/src/java.sql/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines the JDBC API. + */ module java.sql { requires public java.logging; requires public java.xml; diff --git a/jdk/src/java.transaction/share/classes/module-info.java b/jdk/src/java.transaction/share/classes/module-info.java index de572d90cb5..84daf74a27d 100644 --- a/jdk/src/java.transaction/share/classes/module-info.java +++ b/jdk/src/java.transaction/share/classes/module-info.java @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines a subset of the Java Transaction API (JTA) to support CORBA interop. + *

+ * The subset consists of RMI exception types which are mapped to CORBA system + * exceptions by the 'Java Language to IDL Mapping Specification'. + */ module java.transaction { requires public java.rmi; exports javax.transaction; diff --git a/jdk/src/java.xml.crypto/share/classes/module-info.java b/jdk/src/java.xml.crypto/share/classes/module-info.java index 1c92d07ad80..62694bba195 100644 --- a/jdk/src/java.xml.crypto/share/classes/module-info.java +++ b/jdk/src/java.xml.crypto/share/classes/module-info.java @@ -23,6 +23,9 @@ * questions. */ +/** + * Defines an API for XML cryptography. + */ module java.xml.crypto { requires public java.xml; requires java.logging; From ae448d6e828d2a07dc3406df698fc393257c472c Mon Sep 17 00:00:00 2001 From: Svetlana Nikandrova Date: Thu, 18 Aug 2016 16:27:15 +0300 Subject: [PATCH 083/115] 8146602: jdk/test/sun/misc/URLClassPath/ClassnameCharTest.java test fails with NullPointerException Reviewed-by: dfuchs, clanger --- .../misc/URLClassPath/ClassnameCharTest.java | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/jdk/test/sun/misc/URLClassPath/ClassnameCharTest.java b/jdk/test/sun/misc/URLClassPath/ClassnameCharTest.java index aba760aded1..ea873180b78 100644 --- a/jdk/test/sun/misc/URLClassPath/ClassnameCharTest.java +++ b/jdk/test/sun/misc/URLClassPath/ClassnameCharTest.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 @@ -103,16 +103,60 @@ public class ClassnameCharTest { //--------------------- Infrastructure --------------------------- static volatile int passed = 0, failed = 0; - static boolean pass() {passed++; return true;} - static boolean fail() {failed++; server.stop(0); Thread.dumpStack(); return false;} - static boolean fail(String msg) {System.out.println(msg); return fail();} - static void unexpected(Throwable t) {failed++; server.stop(0); t.printStackTrace();} - static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;} + + static boolean pass() { + passed++; + return true; + } + + static boolean fail() { + failed++; + if (server != null) { + server.stop(0); + } + Thread.dumpStack(); + return false; + } + + static boolean fail(String msg) { + System.out.println(msg); + return fail(); + } + + static void unexpected(Throwable t) { + failed++; + if (server != null) { + server.stop(0); + } + t.printStackTrace(); + } + + static boolean check(boolean cond) { + if (cond) { + pass(); + } else { + fail(); + } + return cond; + } + static boolean equal(Object x, Object y) { - if (x == null ? y == null : x.equals(y)) return pass(); - else return fail(x + " not equal to " + y);} + if (x == null ? y == null : x.equals(y)) { + return pass(); + } else { + return fail(x + " not equal to " + y); + } + } + public static void main(String[] args) throws Throwable { - try {realMain(args);} catch (Throwable t) {unexpected(t);} + try { + realMain(args); + } catch (Throwable t) { + unexpected(t); + } System.out.println("\nPassed = " + passed + " failed = " + failed); - if (failed > 0) throw new AssertionError("Some tests failed");} + if (failed > 0) { + throw new AssertionError("Some tests failed"); + } + } } From f657bd2fa96d1d51e1de48f69b44d929d5e87f49 Mon Sep 17 00:00:00 2001 From: Alejandro Murillo Date: Thu, 18 Aug 2016 09:52:43 -0700 Subject: [PATCH 084/115] 8164329: Problem list sun/rmi/runtime/Log/6409194/NoConsoleOutput.java on windows due to JDK-8164124 Reviewed-by: darcy --- jdk/test/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 5bad9db84d4..50eb6e6b321 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -211,6 +211,8 @@ sun/rmi/rmic/newrmic/equivalence/run.sh 8145980 generic- java/rmi/transport/dgcDeadLock/DGCDeadLock.java 8029360 macosx-all +sun/rmi/runtime/Log/6409194/NoConsoleOutput.java 8164124 windows-all + ############################################################################ # jdk_security From 9dcafe04f0ad281ecbe50ccdb4f45ccb9a77e4e6 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Thu, 18 Aug 2016 19:00:39 +0200 Subject: [PATCH 085/115] 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time Reviewed-by: vlivanov, mhaupt, shade --- .../java/lang/invoke/BoundMethodHandle.java | 3 +- .../lang/invoke/DelegatingMethodHandle.java | 31 ++++++-- .../java/lang/invoke/DirectMethodHandle.java | 26 ++++--- .../lang/invoke/GenerateJLIClassesHelper.java | 76 ++++++++++++++++--- .../lang/invoke/InvokerBytecodeGenerator.java | 43 ++++++++++- .../classes/java/lang/invoke/LambdaForm.java | 72 +++++++++++------- .../java/lang/invoke/MethodHandleImpl.java | 15 +++- .../internal/misc/JavaLangInvokeAccess.java | 13 +++- .../plugins/GenerateJLIClassesPlugin.java | 47 +++++++++--- .../lang/StackWalker/VerifyStackTrace.java | 4 + 10 files changed, 254 insertions(+), 76 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java index 3b6fad7a636..91071a2b3b4 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java @@ -36,7 +36,6 @@ import sun.invoke.util.Wrapper; import java.lang.invoke.LambdaForm.NamedFunction; import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Field; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; @@ -308,7 +307,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; /*non-public*/ char fieldTypeChar(int i) { return typeChars.charAt(i); } - Object fieldSignature() { + String fieldSignature() { return typeChars; } public Class fieldHolder() { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java index 2e4baec0857..d11012e6487 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java @@ -27,6 +27,7 @@ package java.lang.invoke; import java.util.Arrays; import static java.lang.invoke.LambdaForm.*; +import static java.lang.invoke.LambdaForm.Kind.*; import static java.lang.invoke.MethodHandleStatics.*; /** @@ -96,14 +97,8 @@ abstract class DelegatingMethodHandle extends MethodHandle { int whichCache, Object constraint, NamedFunction getTargetFn) { - String debugString; - switch(whichCache) { - case MethodTypeForm.LF_REBIND: debugString = "BMH.reinvoke"; break; - case MethodTypeForm.LF_DELEGATE: debugString = "MH.delegate"; break; - default: debugString = "MH.reinvoke"; break; - } // No pre-action needed. - return makeReinvokerForm(target, whichCache, constraint, debugString, true, getTargetFn, null); + return makeReinvokerForm(target, whichCache, constraint, null, true, getTargetFn, null); } /** Create a LF which simply reinvokes a target of the given basic type. */ static LambdaForm makeReinvokerForm(MethodHandle target, @@ -114,6 +109,10 @@ abstract class DelegatingMethodHandle extends MethodHandle { NamedFunction getTargetFn, NamedFunction preActionFn) { MethodType mtype = target.type().basicType(); + Kind kind = whichKind(whichCache); + if (debugString == null) { + debugString = kind.defaultLambdaName; + } boolean customized = (whichCache < 0 || mtype.parameterSlotCount() > MethodType.MAX_MH_INVOKER_ARITY); boolean hasPreAction = (preActionFn != null); @@ -145,13 +144,21 @@ abstract class DelegatingMethodHandle extends MethodHandle { targetArgs[0] = names[NEXT_MH]; // overwrite this MH with next MH names[REINVOKE] = new LambdaForm.Name(mtype, targetArgs); } - form = new LambdaForm(debugString, ARG_LIMIT, names, forceInline); + form = new LambdaForm(debugString, ARG_LIMIT, names, forceInline, kind); if (!customized) { form = mtype.form().setCachedLambdaForm(whichCache, form); } return form; } + private static Kind whichKind(int whichCache) { + switch(whichCache) { + case MethodTypeForm.LF_REBIND: return BOUND_REINVOKER; + case MethodTypeForm.LF_DELEGATE: return DELEGATE; + default: return REINVOKER; + } + } + static final NamedFunction NF_getTarget; static { try { @@ -160,5 +167,13 @@ abstract class DelegatingMethodHandle extends MethodHandle { } catch (ReflectiveOperationException ex) { throw newInternalError(ex); } + // The Holder class will contain pre-generated DelegatingMethodHandles resolved + // speculatively using MemberName.getFactory().resolveOrNull. However, that + // doesn't initialize the class, which subtly breaks inlining etc. By forcing + // initialization of the Holder class we avoid these issues. + UNSAFE.ensureClassInitialized(Holder.class); } + + /* Placeholder class for DelegatingMethodHandles generated ahead of time */ + final class Holder {} } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java index 494103f57cc..174e914f805 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.Objects; import static java.lang.invoke.LambdaForm.*; +import static java.lang.invoke.LambdaForm.Kind.*; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.UNSAFE; import static java.lang.invoke.MethodHandleStatics.newInternalError; @@ -189,14 +190,15 @@ class DirectMethodHandle extends MethodHandle { static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) { boolean needsInit = (which == LF_INVSTATIC_INIT); boolean doesAlloc = (which == LF_NEWINVSPECIAL); - String linkerName, lambdaName; + String linkerName; + LambdaForm.Kind kind; switch (which) { - case LF_INVVIRTUAL: linkerName = "linkToVirtual"; lambdaName = "DMH.invokeVirtual"; break; - case LF_INVSTATIC: linkerName = "linkToStatic"; lambdaName = "DMH.invokeStatic"; break; - case LF_INVSTATIC_INIT:linkerName = "linkToStatic"; lambdaName = "DMH.invokeStaticInit"; break; - case LF_INVSPECIAL: linkerName = "linkToSpecial"; lambdaName = "DMH.invokeSpecial"; break; - case LF_INVINTERFACE: linkerName = "linkToInterface"; lambdaName = "DMH.invokeInterface"; break; - case LF_NEWINVSPECIAL: linkerName = "linkToSpecial"; lambdaName = "DMH.newInvokeSpecial"; break; + case LF_INVVIRTUAL: linkerName = "linkToVirtual"; kind = DIRECT_INVOKE_VIRTUAL; break; + case LF_INVSTATIC: linkerName = "linkToStatic"; kind = DIRECT_INVOKE_STATIC; break; + case LF_INVSTATIC_INIT:linkerName = "linkToStatic"; kind = DIRECT_INVOKE_STATIC_INIT; break; + case LF_INVSPECIAL: linkerName = "linkToSpecial"; kind = DIRECT_INVOKE_SPECIAL; break; + case LF_INVINTERFACE: linkerName = "linkToInterface"; kind = DIRECT_INVOKE_INTERFACE; break; + case LF_NEWINVSPECIAL: linkerName = "linkToSpecial"; kind = DIRECT_NEW_INVOKE_SPECIAL; break; default: throw new InternalError("which="+which); } @@ -240,11 +242,11 @@ class DirectMethodHandle extends MethodHandle { result = NEW_OBJ; } names[LINKER_CALL] = new Name(linker, outArgs); - lambdaName += "_" + shortenSignature(basicTypeSignature(mtype)); - LambdaForm lform = new LambdaForm(lambdaName, ARG_LIMIT, names, result); + String lambdaName = kind.defaultLambdaName + "_" + shortenSignature(basicTypeSignature(mtype)); + LambdaForm lform = new LambdaForm(lambdaName, ARG_LIMIT, names, result, kind); // This is a tricky bit of code. Don't send it through the LF interpreter. - lform.compileToBytecode(Holder.class); + lform.compileToBytecode(); return lform; } @@ -705,7 +707,7 @@ class DirectMethodHandle extends MethodHandle { } static { - // The DMH class will contain pre-generated DirectMethodHandles resolved + // The Holder class will contain pre-generated DirectMethodHandles resolved // speculatively using MemberName.getFactory().resolveOrNull. However, that // doesn't initialize the class, which subtly breaks inlining etc. By forcing // initialization of the Holder class we avoid these issues. @@ -713,5 +715,5 @@ class DirectMethodHandle extends MethodHandle { } /* Placeholder class for DirectMethodHandles generated ahead of time */ - private final class Holder {} + final class Holder {} } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java index 5edf33c8c60..1f1b50d67c5 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -29,21 +29,56 @@ import java.util.Map; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.Opcodes; +import java.util.ArrayList; +import java.util.HashSet; + /** * Helper class to assist the GenerateJLIClassesPlugin to get access to * generate classes ahead of time. */ class GenerateJLIClassesHelper { - static byte[] generateDMHClassBytes(String className, + static byte[] generateDirectMethodHandleHolderClassBytes(String className, MethodType[] methodTypes, int[] types) { LambdaForm[] forms = new LambdaForm[methodTypes.length]; + String[] names = new String[methodTypes.length]; for (int i = 0; i < forms.length; i++) { forms[i] = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i], types[i]); - methodTypes[i] = forms[i].methodType(); + names[i] = forms[i].kind.defaultLambdaName; } - return generateCodeBytesForLFs(className, forms, methodTypes); + return generateCodeBytesForLFs(className, names, forms); + } + + static byte[] generateDelegatingMethodHandleHolderClassBytes(String className, + MethodType[] methodTypes) { + + HashSet dedupSet = new HashSet<>(); + ArrayList forms = new ArrayList<>(); + ArrayList names = new ArrayList<>(); + for (int i = 0; i < methodTypes.length; i++) { + // generate methods representing the DelegatingMethodHandle + if (dedupSet.add(methodTypes[i])) { + // reinvokers are variant with the associated SpeciesData + // and shape of the target LF, but we can easily pregenerate + // the basic reinvokers associated with Species_L. Ultimately we + // may want to consider pregenerating more of these, which will + // require an even more complex naming scheme + LambdaForm reinvoker = makeReinvokerFor(methodTypes[i]); + forms.add(reinvoker); + String speciesSig = BoundMethodHandle + .speciesData(reinvoker).fieldSignature(); + assert(speciesSig.equals("L")); + names.add(reinvoker.kind.defaultLambdaName + "_" + speciesSig); + + LambdaForm delegate = makeDelegateFor(methodTypes[i]); + forms.add(delegate); + names.add(delegate.kind.defaultLambdaName); + } + } + return generateCodeBytesForLFs(className, + names.toArray(new String[0]), + forms.toArray(new LambdaForm[0])); } /* @@ -51,22 +86,45 @@ class GenerateJLIClassesHelper { * a class with a specified name. */ private static byte[] generateCodeBytesForLFs(String className, - LambdaForm[] forms, MethodType[] types) { - assert(forms.length == types.length); + String[] names, LambdaForm[] forms) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null); cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null); + for (int i = 0; i < forms.length; i++) { - InvokerBytecodeGenerator g - = new InvokerBytecodeGenerator(className, forms[i], types[i]); - g.setClassWriter(cw); - g.addMethod(); + addMethod(className, names[i], forms[i], + forms[i].methodType(), cw); } return cw.toByteArray(); } + private static void addMethod(String className, String methodName, LambdaForm form, + MethodType type, ClassWriter cw) { + InvokerBytecodeGenerator g + = new InvokerBytecodeGenerator(className, methodName, form, type); + g.setClassWriter(cw); + g.addMethod(); + } + + private static LambdaForm makeReinvokerFor(MethodType type) { + MethodHandle emptyHandle = MethodHandles.empty(type); + return DelegatingMethodHandle.makeReinvokerForm(emptyHandle, + MethodTypeForm.LF_REBIND, + BoundMethodHandle.speciesData_L(), + BoundMethodHandle.speciesData_L().getterFunction(0)); + } + + private static LambdaForm makeDelegateFor(MethodType type) { + MethodHandle handle = MethodHandles.empty(type); + return DelegatingMethodHandle.makeReinvokerForm( + handle, + MethodTypeForm.LF_DELEGATE, + DelegatingMethodHandle.class, + DelegatingMethodHandle.NF_getTarget); + } + static Map.Entry generateConcreteBMHClassBytes( final String types) { for (char c : types.toCharArray()) { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 3508a11b049..ebfe415fbf1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -46,6 +46,7 @@ import java.util.stream.Stream; import static java.lang.invoke.LambdaForm.*; import static java.lang.invoke.LambdaForm.BasicType.*; +import static java.lang.invoke.LambdaForm.Kind.*; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.*; @@ -125,9 +126,15 @@ class InvokerBytecodeGenerator { } /** For generating customized code for a single LambdaForm. */ - InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) { + private InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) { + this(className, form.debugName, form, invokerType); + } + + /** For generating customized code for a single LambdaForm. */ + InvokerBytecodeGenerator(String className, String invokerName, + LambdaForm form, MethodType invokerType) { this(form, form.names.length, - className, form.debugName, invokerType); + className, invokerName, invokerType); // Create an array to map name indexes to locals indexes. Name[] names = form.names; for (int i = 0, index = 0; i < localsMap.length; i++) { @@ -597,10 +604,42 @@ class InvokerBytecodeGenerator { return c.getName().replace('.', '/'); } + private static MemberName resolveFrom(String name, MethodType type, Class holder) { + MemberName member = new MemberName(holder, name, type, REF_invokeStatic); + MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, holder); + + return resolvedMember; + } + + private static MemberName lookupPregenerated(LambdaForm form) { + if (form.customized != null) { + // No pre-generated version for customized LF + return null; + } + MethodType invokerType = form.methodType(); + String name = form.kind.methodName; + switch (form.kind) { + case BOUND_REINVOKER: { + name = name + "_" + BoundMethodHandle.speciesData(form).fieldSignature(); + return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); + } + case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); + case DIRECT_INVOKE_INTERFACE: // fall-through + case DIRECT_INVOKE_SPECIAL: // fall-through + case DIRECT_INVOKE_STATIC: // fall-through + case DIRECT_INVOKE_STATIC_INIT: // fall-through + case DIRECT_INVOKE_VIRTUAL: return resolveFrom(name, invokerType, DirectMethodHandle.Holder.class); + } + return null; + } + /** * Generate customized bytecode for a given LambdaForm. */ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) { + MemberName pregenerated = lookupPregenerated(form); + if (pregenerated != null) return pregenerated; // pre-generated bytecode + InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType); return g.loadMethod(g.generateCustomizedCodeBytes()); } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index a007881252f..c70d6c4163a 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -41,6 +41,7 @@ import java.util.HashMap; import static java.lang.invoke.LambdaForm.BasicType.*; import static java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic; import static java.lang.invoke.MethodHandleStatics.*; +import java.util.Objects; /** * The symbolic, non-executable form of a method handle's invocation semantics. @@ -127,6 +128,7 @@ class LambdaForm { final MethodHandle customized; @Stable final Name[] names; final String debugName; + final Kind kind; MemberName vmentry; // low-level behavior, or null if not yet prepared private boolean isCompiled; @@ -266,12 +268,46 @@ class LambdaForm { } } + enum Kind { + GENERIC(""), + BOUND_REINVOKER("BMH.reinvoke"), + REINVOKER("MH.reinvoke"), + DELEGATE("MH.delegate"), + DIRECT_INVOKE_VIRTUAL("DMH.invokeVirtual"), + DIRECT_INVOKE_SPECIAL("DMH.invokeSpecial"), + DIRECT_INVOKE_STATIC("DMH.invokeStatic"), + DIRECT_NEW_INVOKE_SPECIAL("DMH.newInvokeSpecial"), + DIRECT_INVOKE_INTERFACE("DMH.invokeInterface"), + DIRECT_INVOKE_STATIC_INIT("DMH.invokeStaticInit"); + + final String defaultLambdaName; + final String methodName; + + private Kind(String defaultLambdaName) { + this.defaultLambdaName = defaultLambdaName; + int p = defaultLambdaName.indexOf('.'); + if (p > -1) { + this.methodName = defaultLambdaName.substring(p + 1); + } else { + this.methodName = defaultLambdaName; + } + } + } + LambdaForm(String debugName, int arity, Name[] names, int result) { - this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null); + this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null, Kind.GENERIC); + } + LambdaForm(String debugName, + int arity, Name[] names, int result, Kind kind) { + this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null, kind); } LambdaForm(String debugName, int arity, Name[] names, int result, boolean forceInline, MethodHandle customized) { + this(debugName, arity, names, result, forceInline, customized, Kind.GENERIC); + } + LambdaForm(String debugName, + int arity, Name[] names, int result, boolean forceInline, MethodHandle customized, Kind kind) { assert(namesOK(arity, names)); this.arity = arity; this.result = fixResult(result, names); @@ -279,6 +315,7 @@ class LambdaForm { this.debugName = fixDebugName(debugName); this.forceInline = forceInline; this.customized = customized; + this.kind = kind; int maxOutArity = normalize(); if (maxOutArity > MethodType.MAX_MH_INVOKER_ARITY) { // Cannot use LF interpreter on very high arity expressions. @@ -288,11 +325,15 @@ class LambdaForm { } LambdaForm(String debugName, int arity, Name[] names) { - this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null); + this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null, Kind.GENERIC); } LambdaForm(String debugName, int arity, Name[] names, boolean forceInline) { - this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null); + this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null, Kind.GENERIC); + } + LambdaForm(String debugName, + int arity, Name[] names, boolean forceInline, Kind kind) { + this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null, kind); } LambdaForm(String debugName, Name[] formals, Name[] temps, Name result) { @@ -325,6 +366,7 @@ class LambdaForm { this.debugName = "LF.zero"; this.forceInline = true; this.customized = null; + this.kind = Kind.GENERIC; assert(nameRefsAreLegal()); assert(isEmpty()); String sig = null; @@ -395,7 +437,7 @@ class LambdaForm { /** Customize LambdaForm for a particular MethodHandle */ LambdaForm customize(MethodHandle mh) { - LambdaForm customForm = new LambdaForm(debugName, arity, names, result, forceInline, mh); + LambdaForm customForm = new LambdaForm(debugName, arity, names, result, forceInline, mh, kind); if (COMPILE_THRESHOLD >= 0 && isCompiled) { // If shared LambdaForm has been compiled, compile customized version as well. customForm.compileToBytecode(); @@ -773,28 +815,6 @@ class LambdaForm { } } - /** - * Generate optimizable bytecode for this form after first looking for a - * pregenerated version in a specified class. - */ - void compileToBytecode(Class lookupClass) { - if (vmentry != null && isCompiled) { - return; // already compiled somehow - } - MethodType invokerType = methodType(); - assert(vmentry == null || vmentry.getMethodType().basicType().equals(invokerType)); - int dot = debugName.indexOf('.'); - String methodName = (dot > 0) ? debugName.substring(dot + 1) : debugName; - MemberName member = new MemberName(lookupClass, methodName, invokerType, REF_invokeStatic); - MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, lookupClass); - if (resolvedMember != null) { - vmentry = resolvedMember; - isCompiled = true; - } else { - compileToBytecode(); - } - } - private static void computeInitialPreparedForms() { // Find all predefined invokers and associate them with canonical empty lambda forms. for (MemberName m : MemberName.getFactory().getMethods(LambdaForm.class, false, null, null, null)) { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index 60dc84f65ed..a0561589beb 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -1718,10 +1718,19 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; } @Override - public byte[] generateDMHClassBytes(String className, - MethodType[] methodTypes, int[] types) { + public byte[] generateDirectMethodHandleHolderClassBytes( + String className, MethodType[] methodTypes, int[] types) { return GenerateJLIClassesHelper - .generateDMHClassBytes(className, methodTypes, types); + .generateDirectMethodHandleHolderClassBytes( + className, methodTypes, types); + } + + @Override + public byte[] generateDelegatingMethodHandleHolderClassBytes( + String className, MethodType[] methodTypes) { + return GenerateJLIClassesHelper + .generateDelegatingMethodHandleHolderClassBytes( + className, methodTypes); } @Override diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java index e514e5c95c0..ea941316b4e 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java @@ -51,8 +51,17 @@ public interface JavaLangInvokeAccess { * an {@code int} representing method type. Used by * GenerateJLIClassesPlugin to generate such a class during the jlink phase. */ - byte[] generateDMHClassBytes(String className, MethodType[] methodTypes, - int[] types); + byte[] generateDirectMethodHandleHolderClassBytes(String className, + MethodType[] methodTypes, int[] types); + + /** + * Returns a {@code byte[]} containing the bytecode for a class implementing + * DelegatingMethodHandles of each {@code MethodType} kind in the + * {@code methodTypes} argument. Used by GenerateJLIClassesPlugin to + * generate such a class during the jlink phase. + */ + byte[] generateDelegatingMethodHandleHolderClassBytes(String className, + MethodType[] methodTypes); /** * Returns a {@code byte[]} containing the bytecode for a BoundMethodHandle diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java index 1697e988b53..3866c95c2dc 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java @@ -55,7 +55,7 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME); - private static final String DMH = "java/lang/invoke/DirectMethodHandle$Holder"; + private static final String DIRECT_METHOD_HANDLE = "java/lang/invoke/DirectMethodHandle$Holder"; private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual"; private static final String DMH_INVOKE_STATIC = "invokeStatic"; private static final String DMH_INVOKE_SPECIAL = "invokeSpecial"; @@ -63,6 +63,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DMH_INVOKE_INTERFACE = "invokeInterface"; private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit"; + private static final String DELEGATING_METHOD_HANDLE = "java/lang/invoke/DelegatingMethodHandle$Holder"; + private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); @@ -222,7 +224,15 @@ public final class GenerateJLIClassesPlugin implements Plugin { @Override public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { // Copy all but DMH_ENTRY to out - in.transformAndCopy(entry -> entry.path().equals(DMH_ENTRY) ? null : entry, out); + in.transformAndCopy(entry -> { + // filter out placeholder entries + if (entry.path().equals(DIRECT_METHOD_HANDLE_ENTRY) || + entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY)) { + return null; + } else { + return entry; + } + }, out); speciesTypes.forEach(types -> generateBMHClass(types, out)); generateDMHClass(out); return out.build(); @@ -264,15 +274,24 @@ public final class GenerateJLIClassesPlugin implements Plugin { } } try { - byte[] bytes = - JLIA.generateDMHClassBytes(DMH, methodTypes, dmhTypes); - ResourcePoolEntry ndata = ResourcePoolEntry.create(DMH_ENTRY, bytes); + byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes( + DIRECT_METHOD_HANDLE, methodTypes, dmhTypes); + ResourcePoolEntry ndata = ResourcePoolEntry + .create(DIRECT_METHOD_HANDLE_ENTRY, bytes); + out.add(ndata); + + bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes( + DELEGATING_METHOD_HANDLE, methodTypes); + ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HANDLE_ENTRY, bytes); out.add(ndata); } catch (Exception ex) { throw new PluginException(ex); } } - private static final String DMH_ENTRY = "/java.base/" + DMH + ".class"; + private static final String DIRECT_METHOD_HANDLE_ENTRY = + "/java.base/" + DIRECT_METHOD_HANDLE + ".class"; + private static final String DELEGATING_METHOD_HANDLE_ENTRY = + "/java.base/" + DELEGATING_METHOD_HANDLE + ".class"; // Convert LL -> LL, L3 -> LLL private static String expandSignature(String signature) { @@ -310,15 +329,19 @@ public final class GenerateJLIClassesPlugin implements Plugin { assert(parts.length == 2); assert(parts[1].length() == 1); String parameters = expandSignature(parts[0]); - Class rtype = primitiveType(parts[1].charAt(0)); - Class[] ptypes = new Class[parameters.length()]; - for (int i = 0; i < ptypes.length; i++) { - ptypes[i] = primitiveType(parameters.charAt(i)); + Class rtype = simpleType(parts[1].charAt(0)); + if (parameters.isEmpty()) { + return MethodType.methodType(rtype); + } else { + Class[] ptypes = new Class[parameters.length()]; + for (int i = 0; i < ptypes.length; i++) { + ptypes[i] = simpleType(parameters.charAt(i)); + } + return MethodType.methodType(rtype, ptypes); } - return MethodType.methodType(rtype, ptypes); } - private static Class primitiveType(char c) { + private static Class simpleType(char c) { switch (c) { case 'F': return float.class; diff --git a/jdk/test/java/lang/StackWalker/VerifyStackTrace.java b/jdk/test/java/lang/StackWalker/VerifyStackTrace.java index eb4a5085a5a..2c70a6d02dc 100644 --- a/jdk/test/java/lang/StackWalker/VerifyStackTrace.java +++ b/jdk/test/java/lang/StackWalker/VerifyStackTrace.java @@ -205,8 +205,12 @@ public class VerifyStackTrace { .replaceAll("java.base@(\\d+\\.){0,3}(\\d+)/", "java.base/") .replaceAll("/[0-9]+\\.run", "/xxxxxxxx.run") .replaceAll("/[0-9]+\\.invoke", "/xxxxxxxx.invoke") + // DMHs may or may not be pre-generated, making frames differ .replaceAll("DirectMethodHandle\\$Holder", "LambdaForm\\$DMH") .replaceAll("DMH\\.invoke", "DMH/xxxxxxxx.invoke") + // invoke frames may or may not have basic method type + // information encoded for diagnostic purposes + .replaceAll("xx\\.invoke([A-Za-z]*)_[A-Z]+_[A-Z]", "xx.invoke$1") .replaceAll("\\$[0-9]+", "\\$??"); } else { return produced; From 7cb94a8bf88cbbedac5fbfa85702140f61493dca Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Thu, 18 Aug 2016 15:05:02 -0400 Subject: [PATCH 086/115] 8138661: Minor correction in Java API doc for DataSource Reviewed-by: naoto --- jdk/src/java.sql/share/classes/javax/sql/DataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.sql/share/classes/javax/sql/DataSource.java b/jdk/src/java.sql/share/classes/javax/sql/DataSource.java index dbdfd4c07de..4c3274d22d9 100644 --- a/jdk/src/java.sql/share/classes/javax/sql/DataSource.java +++ b/jdk/src/java.sql/share/classes/javax/sql/DataSource.java @@ -64,7 +64,7 @@ import java.sql.Wrapper; *

* A driver that is accessed via a {@code DataSource} object does not * register itself with the {@code DriverManager}. Rather, a - * {@code DataSource} object is retrieved though a lookup operation + * {@code DataSource} object is retrieved through a lookup operation * and then used to create a {@code Connection} object. With a basic * implementation, the connection obtained through a {@code DataSource} * object is identical to a connection obtained through the From 25ff06c014932890fe88a3517632e16ebfdee8d7 Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Thu, 18 Aug 2016 22:07:09 +0300 Subject: [PATCH 087/115] 8163517: Various cleanup in java.io code Reviewed-by: shade, rriggs, redestad --- .../share/classes/java/io/BufferedReader.java | 2 +- .../java/io/ByteArrayOutputStream.java | 2 +- .../classes/java/io/CharArrayWriter.java | 13 +++++------ .../share/classes/java/io/FileSystem.java | 9 ++------ .../classes/java/io/ObjectInputStream.java | 16 ++++++-------- .../classes/java/io/ObjectOutputStream.java | 16 ++++++-------- .../classes/java/io/ObjectStreamClass.java | 20 ++++++++--------- .../classes/java/io/OutputStreamWriter.java | 14 ++++-------- .../share/classes/java/io/PrintStream.java | 17 +++++--------- .../share/classes/java/io/PrintWriter.java | 17 +++++--------- .../classes/java/io/SequenceInputStream.java | 22 ++++++------------- .../java/io/StringBufferInputStream.java | 9 +++----- .../share/classes/java/io/StringReader.java | 4 ++-- .../share/classes/java/io/StringWriter.java | 14 +++++------- .../share/classes/java/io/Writer.java | 14 +++++------- 15 files changed, 69 insertions(+), 120 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/io/BufferedReader.java b/jdk/src/java.base/share/classes/java/io/BufferedReader.java index 3940b3b8776..1f6a66490cd 100644 --- a/jdk/src/java.base/share/classes/java/io/BufferedReader.java +++ b/jdk/src/java.base/share/classes/java/io/BufferedReader.java @@ -560,7 +560,7 @@ public class BufferedReader extends Reader { * @since 1.8 */ public Stream lines() { - Iterator iter = new Iterator() { + Iterator iter = new Iterator<>() { String nextLine = null; @Override diff --git a/jdk/src/java.base/share/classes/java/io/ByteArrayOutputStream.java b/jdk/src/java.base/share/classes/java/io/ByteArrayOutputStream.java index 61a147d1c4d..bd867c08d76 100644 --- a/jdk/src/java.base/share/classes/java/io/ByteArrayOutputStream.java +++ b/jdk/src/java.base/share/classes/java/io/ByteArrayOutputStream.java @@ -187,7 +187,7 @@ public class ByteArrayOutputStream extends OutputStream { * @return the current contents of this output stream, as a byte array. * @see java.io.ByteArrayOutputStream#size() */ - public synchronized byte toByteArray()[] { + public synchronized byte[] toByteArray() { return Arrays.copyOf(buf, count); } diff --git a/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java b/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java index 773b59614d9..e8bf2c36167 100644 --- a/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java +++ b/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java @@ -165,7 +165,7 @@ class CharArrayWriter extends Writer { * * @param csq * The character sequence to append. If {@code csq} is - * {@code null}, then the four characters "{@code null}" are + * {@code null}, then the four characters {@code "null"} are * appended to this writer. * * @return This writer @@ -173,7 +173,7 @@ class CharArrayWriter extends Writer { * @since 1.5 */ public CharArrayWriter append(CharSequence csq) { - String s = (csq == null ? "null" : csq.toString()); + String s = String.valueOf(csq); write(s, 0, s.length()); return this; } @@ -193,7 +193,7 @@ class CharArrayWriter extends Writer { * The character sequence from which a subsequence will be * appended. If {@code csq} is {@code null}, then characters * will be appended as if {@code csq} contained the four - * characters "{@code null}". + * characters {@code "null"}. * * @param start * The index of the first character in the subsequence @@ -212,9 +212,8 @@ class CharArrayWriter extends Writer { * @since 1.5 */ public CharArrayWriter append(CharSequence csq, int start, int end) { - String s = (csq == null ? "null" : csq).subSequence(start, end).toString(); - write(s, 0, s.length()); - return this; + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } /** @@ -251,7 +250,7 @@ class CharArrayWriter extends Writer { * * @return an array of chars copied from the input data. */ - public char toCharArray()[] { + public char[] toCharArray() { synchronized (lock) { return Arrays.copyOf(buf, count); } diff --git a/jdk/src/java.base/share/classes/java/io/FileSystem.java b/jdk/src/java.base/share/classes/java/io/FileSystem.java index 9d73e79ed40..a7528a9b5ca 100644 --- a/jdk/src/java.base/share/classes/java/io/FileSystem.java +++ b/jdk/src/java.base/share/classes/java/io/FileSystem.java @@ -228,13 +228,8 @@ abstract class FileSystem { static boolean useCanonPrefixCache = true; private static boolean getBooleanProperty(String prop, boolean defaultVal) { - String val = System.getProperty(prop); - if (val == null) return defaultVal; - if (val.equalsIgnoreCase("true")) { - return true; - } else { - return false; - } + return Boolean.parseBoolean(System.getProperty(prop, + String.valueOf(defaultVal))); } static { diff --git a/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java b/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java index 9f13c9216a3..1895203cd11 100644 --- a/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java +++ b/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java @@ -1265,22 +1265,21 @@ public class ObjectInputStream WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue); Boolean result = Caches.subclassAudits.get(key); if (result == null) { - result = Boolean.valueOf(auditSubclass(cl)); + result = auditSubclass(cl); Caches.subclassAudits.putIfAbsent(key, result); } - if (result.booleanValue()) { - return; + if (!result) { + sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); } - sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); } /** * Performs reflective checks on given subclass to verify that it doesn't - * override security-sensitive non-final methods. Returns true if subclass - * is "safe", false otherwise. + * override security-sensitive non-final methods. Returns TRUE if subclass + * is "safe", FALSE otherwise. */ - private static boolean auditSubclass(final Class subcl) { - Boolean result = AccessController.doPrivileged( + private static Boolean auditSubclass(Class subcl) { + return AccessController.doPrivileged( new PrivilegedAction<>() { public Boolean run() { for (Class cl = subcl; @@ -1303,7 +1302,6 @@ public class ObjectInputStream } } ); - return result.booleanValue(); } /** diff --git a/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java b/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java index 2fc905e2dd3..bff6f8311ee 100644 --- a/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java +++ b/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java @@ -1050,22 +1050,21 @@ public class ObjectOutputStream WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue); Boolean result = Caches.subclassAudits.get(key); if (result == null) { - result = Boolean.valueOf(auditSubclass(cl)); + result = auditSubclass(cl); Caches.subclassAudits.putIfAbsent(key, result); } - if (result.booleanValue()) { - return; + if (!result) { + sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); } - sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); } /** * Performs reflective checks on given subclass to verify that it doesn't - * override security-sensitive non-final methods. Returns true if subclass - * is "safe", false otherwise. + * override security-sensitive non-final methods. Returns TRUE if subclass + * is "safe", FALSE otherwise. */ - private static boolean auditSubclass(final Class subcl) { - Boolean result = AccessController.doPrivileged( + private static Boolean auditSubclass(Class subcl) { + return AccessController.doPrivileged( new PrivilegedAction<>() { public Boolean run() { for (Class cl = subcl; @@ -1088,7 +1087,6 @@ public class ObjectOutputStream } } ); - return result.booleanValue(); } /** diff --git a/jdk/src/java.base/share/classes/java/io/ObjectStreamClass.java b/jdk/src/java.base/share/classes/java/io/ObjectStreamClass.java index cca42a71bbf..7ae45cae8c4 100644 --- a/jdk/src/java.base/share/classes/java/io/ObjectStreamClass.java +++ b/jdk/src/java.base/share/classes/java/io/ObjectStreamClass.java @@ -1509,11 +1509,9 @@ public class ObjectStreamClass implements Serializable { private static String getPackageName(Class cl) { String s = cl.getName(); int i = s.lastIndexOf('['); - if (i >= 0) { - s = s.substring(i + 2); - } - i = s.lastIndexOf('.'); - return (i >= 0) ? s.substring(0, i) : ""; + i = (i < 0) ? 0 : i + 2; + int j = s.lastIndexOf('.'); + return (i < j) ? s.substring(i, j) : ""; } /** @@ -1535,14 +1533,14 @@ public class ObjectStreamClass implements Serializable { private static String getMethodSignature(Class[] paramTypes, Class retType) { - StringBuilder sbuf = new StringBuilder(); - sbuf.append('('); + StringBuilder sb = new StringBuilder(); + sb.append('('); for (int i = 0; i < paramTypes.length; i++) { - appendClassSignature(sbuf, paramTypes[i]); + appendClassSignature(sb, paramTypes[i]); } - sbuf.append(')'); - appendClassSignature(sbuf, retType); - return sbuf.toString(); + sb.append(')'); + appendClassSignature(sb, retType); + return sb.toString(); } /** diff --git a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java index 4fdb148baaf..3d44f443b82 100644 --- a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java +++ b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java @@ -233,22 +233,16 @@ public class OutputStreamWriter extends Writer { @Override public Writer append(CharSequence csq, int start, int end) throws IOException { - if (csq == null) { - write("null".subSequence(start, end).toString()); - return this; - } else { - return append(csq.subSequence(start, end)); - } + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } @Override public Writer append(CharSequence csq) throws IOException { - if (csq == null) { - se.write("null"); - } else if (csq instanceof CharBuffer) { + if (csq instanceof CharBuffer) { se.write((CharBuffer) csq); } else { - se.write(csq.toString()); + se.write(String.valueOf(csq)); } return this; } diff --git a/jdk/src/java.base/share/classes/java/io/PrintStream.java b/jdk/src/java.base/share/classes/java/io/PrintStream.java index 36a271e804d..09028de7358 100644 --- a/jdk/src/java.base/share/classes/java/io/PrintStream.java +++ b/jdk/src/java.base/share/classes/java/io/PrintStream.java @@ -568,7 +568,7 @@ public class PrintStream extends FilterOutputStream * @param b The {@code boolean} to be printed */ public void print(boolean b) { - write(b ? "true" : "false"); + write(String.valueOf(b)); } /** @@ -663,10 +663,7 @@ public class PrintStream extends FilterOutputStream * @param s The {@code String} to be printed */ public void print(String s) { - if (s == null) { - s = "null"; - } - write(s); + write(String.valueOf(s)); } /** @@ -1068,10 +1065,7 @@ public class PrintStream extends FilterOutputStream * @since 1.5 */ public PrintStream append(CharSequence csq) { - if (csq == null) - print("null"); - else - print(csq.toString()); + print(String.valueOf(csq)); return this; } @@ -1111,9 +1105,8 @@ public class PrintStream extends FilterOutputStream * @since 1.5 */ public PrintStream append(CharSequence csq, int start, int end) { - CharSequence cs = (csq == null ? "null" : csq); - write(cs.subSequence(start, end).toString()); - return this; + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } /** diff --git a/jdk/src/java.base/share/classes/java/io/PrintWriter.java b/jdk/src/java.base/share/classes/java/io/PrintWriter.java index d516b8ef404..0513312781b 100644 --- a/jdk/src/java.base/share/classes/java/io/PrintWriter.java +++ b/jdk/src/java.base/share/classes/java/io/PrintWriter.java @@ -504,7 +504,7 @@ public class PrintWriter extends Writer { * @param b The {@code boolean} to be printed */ public void print(boolean b) { - write(b ? "true" : "false"); + write(String.valueOf(b)); } /** @@ -599,10 +599,7 @@ public class PrintWriter extends Writer { * @param s The {@code String} to be printed */ public void print(String s) { - if (s == null) { - s = "null"; - } - write(s); + write(String.valueOf(s)); } /** @@ -1005,10 +1002,7 @@ public class PrintWriter extends Writer { * @since 1.5 */ public PrintWriter append(CharSequence csq) { - if (csq == null) - write("null"); - else - write(csq.toString()); + write(String.valueOf(csq)); return this; } @@ -1047,9 +1041,8 @@ public class PrintWriter extends Writer { * @since 1.5 */ public PrintWriter append(CharSequence csq, int start, int end) { - CharSequence cs = (csq == null ? "null" : csq); - write(cs.subSequence(start, end).toString()); - return this; + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } /** diff --git a/jdk/src/java.base/share/classes/java/io/SequenceInputStream.java b/jdk/src/java.base/share/classes/java/io/SequenceInputStream.java index f68f7d25265..b2caa11bca9 100644 --- a/jdk/src/java.base/share/classes/java/io/SequenceInputStream.java +++ b/jdk/src/java.base/share/classes/java/io/SequenceInputStream.java @@ -65,12 +65,7 @@ class SequenceInputStream extends InputStream { */ public SequenceInputStream(Enumeration e) { this.e = e; - try { - nextStream(); - } catch (IOException ex) { - // This should never happen - throw new Error("panic"); - } + peekNextStream(); } /** @@ -86,16 +81,10 @@ class SequenceInputStream extends InputStream { */ public SequenceInputStream(InputStream s1, InputStream s2) { Vector v = new Vector<>(2); - v.addElement(s1); v.addElement(s2); e = v.elements(); - try { - nextStream(); - } catch (IOException ex) { - // This should never happen - throw new Error("panic"); - } + peekNextStream(); } /** @@ -105,14 +94,17 @@ class SequenceInputStream extends InputStream { if (in != null) { in.close(); } + peekNextStream(); + } + private void peekNextStream() { if (e.hasMoreElements()) { in = (InputStream) e.nextElement(); if (in == null) throw new NullPointerException(); + } else { + in = null; } - else in = null; - } /** diff --git a/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java b/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java index 787cbb9c45e..11c230ff932 100644 --- a/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java +++ b/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java @@ -108,6 +108,7 @@ class StringBufferInputStream extends InputStream { * -1 if there is no more data because the end of * the stream has been reached. */ + @SuppressWarnings("deprecation") public synchronized int read(byte b[], int off, int len) { if (b == null) { throw new NullPointerException(); @@ -126,12 +127,8 @@ class StringBufferInputStream extends InputStream { if (len <= 0) { return 0; } - String s = buffer; - int cnt = len; - while (--cnt >= 0) { - b[off++] = (byte)s.charAt(pos++); - } - + buffer.getBytes(pos, pos + len, b, off); + pos += len; return len; } diff --git a/jdk/src/java.base/share/classes/java/io/StringReader.java b/jdk/src/java.base/share/classes/java/io/StringReader.java index 2dd72ff5357..9cfe5412993 100644 --- a/jdk/src/java.base/share/classes/java/io/StringReader.java +++ b/jdk/src/java.base/share/classes/java/io/StringReader.java @@ -142,8 +142,8 @@ public class StringReader extends Reader { */ public boolean ready() throws IOException { synchronized (lock) { - ensureOpen(); - return true; + ensureOpen(); + return true; } } diff --git a/jdk/src/java.base/share/classes/java/io/StringWriter.java b/jdk/src/java.base/share/classes/java/io/StringWriter.java index 15022b353a8..16eed62d7bb 100644 --- a/jdk/src/java.base/share/classes/java/io/StringWriter.java +++ b/jdk/src/java.base/share/classes/java/io/StringWriter.java @@ -139,7 +139,7 @@ public class StringWriter extends Writer { * * @param csq * The character sequence to append. If {@code csq} is - * {@code null}, then the four characters "{@code null}" are + * {@code null}, then the four characters {@code "null"} are * appended to this writer. * * @return This writer @@ -147,10 +147,7 @@ public class StringWriter extends Writer { * @since 1.5 */ public StringWriter append(CharSequence csq) { - if (csq == null) - write("null"); - else - write(csq.toString()); + write(String.valueOf(csq)); return this; } @@ -170,7 +167,7 @@ public class StringWriter extends Writer { * The character sequence from which a subsequence will be * appended. If {@code csq} is {@code null}, then characters * will be appended as if {@code csq} contained the four - * characters "{@code null}". + * characters {@code "null"}. * * @param start * The index of the first character in the subsequence @@ -189,9 +186,8 @@ public class StringWriter extends Writer { * @since 1.5 */ public StringWriter append(CharSequence csq, int start, int end) { - CharSequence cs = (csq == null ? "null" : csq); - write(cs.subSequence(start, end).toString()); - return this; + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } /** diff --git a/jdk/src/java.base/share/classes/java/io/Writer.java b/jdk/src/java.base/share/classes/java/io/Writer.java index 17e8de3ef8a..cd9aded358f 100644 --- a/jdk/src/java.base/share/classes/java/io/Writer.java +++ b/jdk/src/java.base/share/classes/java/io/Writer.java @@ -221,7 +221,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * * @param csq * The character sequence to append. If {@code csq} is - * {@code null}, then the four characters "{@code null}" are + * {@code null}, then the four characters {@code "null"} are * appended to this writer. * * @return This writer @@ -232,10 +232,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * @since 1.5 */ public Writer append(CharSequence csq) throws IOException { - if (csq == null) - write("null"); - else - write(csq.toString()); + write(String.valueOf(csq)); return this; } @@ -256,7 +253,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * The character sequence from which a subsequence will be * appended. If {@code csq} is {@code null}, then characters * will be appended as if {@code csq} contained the four - * characters "{@code null}". + * characters {@code "null"}. * * @param start * The index of the first character in the subsequence @@ -278,9 +275,8 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * @since 1.5 */ public Writer append(CharSequence csq, int start, int end) throws IOException { - CharSequence cs = (csq == null ? "null" : csq); - write(cs.subSequence(start, end).toString()); - return this; + if (csq == null) csq = "null"; + return append(csq.subSequence(start, end)); } /** From 632849163493ea4a7e06962353e98a1bd4f868b1 Mon Sep 17 00:00:00 2001 From: Jamil Nimeh Date: Thu, 18 Aug 2016 12:48:23 -0700 Subject: [PATCH 088/115] 8162808: Add references to the standard JSSE cipher suite names in javadoc Add hyperlinks to the cipher suite section of the Standard Names documentation for various SSL class methods when they reference cipher suites by name Reviewed-by: xuelei, mullan --- .../classes/javax/net/ssl/SSLEngine.java | 22 ++++++++++++++ .../classes/javax/net/ssl/SSLParameters.java | 30 +++++++++++++++++-- .../javax/net/ssl/SSLServerSocket.java | 22 ++++++++++++++ .../javax/net/ssl/SSLServerSocketFactory.java | 16 +++++++++- .../classes/javax/net/ssl/SSLSocket.java | 22 ++++++++++++++ .../javax/net/ssl/SSLSocketFactory.java | 16 +++++++++- 6 files changed, 123 insertions(+), 5 deletions(-) diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java index 3b222cf6ad7..300265cbcd4 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java @@ -861,6 +861,13 @@ public abstract class SSLEngine { * be enabled by default, since this list may include cipher suites which * do not meet quality of service requirements for those defaults. Such * cipher suites might be useful in specialized applications. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getEnabledCipherSuites() @@ -880,6 +887,13 @@ public abstract class SSLEngine { * or the requisite certificates (and private keys) for the suite are * not available, or an anonymous suite is enabled but authentication * is required. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getSupportedCipherSuites() @@ -896,6 +910,14 @@ public abstract class SSLEngine { * fail. Following a successful call to this method, only suites * listed in the {@code suites} parameter are enabled for use. *

+ * Note that the standard list of cipher suite names may be found in the + * + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list or might not + * use the recommended name for a certain cipher suite. + *

* See {@link #getEnabledCipherSuites()} for more information * on why a specific cipher suite may never be used on a engine. * diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLParameters.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLParameters.java index 5d47d37b909..5207c3c1f84 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLParameters.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLParameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -108,7 +108,12 @@ public class SSLParameters { *

* Calling this constructor is equivalent to calling the no-args * constructor followed by - * {@code setCipherSuites(cipherSuites);}. + * {@code setCipherSuites(cipherSuites);}. Note that the + * standard list of cipher suite names may be found in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list. * * @param cipherSuites the array of ciphersuites (or null) */ @@ -123,6 +128,12 @@ public class SSLParameters { * Calling this constructor is equivalent to calling the no-args * constructor followed by * {@code setCipherSuites(cipherSuites); setProtocols(protocols);}. + * Note that the standard list of cipher suite names may be found in the + * + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list. * * @param cipherSuites the array of ciphersuites (or null) * @param protocols the array of protocols (or null) @@ -139,6 +150,13 @@ public class SSLParameters { /** * Returns a copy of the array of ciphersuites or null if none * have been set. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return a copy of the array of ciphersuites or null if none * have been set. @@ -150,7 +168,13 @@ public class SSLParameters { /** * Sets the array of ciphersuites. * - * @param cipherSuites the array of ciphersuites (or null) + * @param cipherSuites the array of ciphersuites (or null). Note that the + * standard list of cipher suite names may be found in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list or might not + * use the recommended name for a certain cipher suite. */ public void setCipherSuites(String[] cipherSuites) { this.cipherSuites = clone(cipherSuites); diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocket.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocket.java index 8c7d9dc3031..ead7d20ae58 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocket.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocket.java @@ -195,6 +195,13 @@ public abstract class SSLServerSocket extends ServerSocket { * or the requisite certificates (and private keys) for the suite are * not available, or an anonymous suite is enabled but authentication * is required. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suites enabled * @see #getSupportedCipherSuites() @@ -215,6 +222,14 @@ public abstract class SSLServerSocket extends ServerSocket { * in this ServerSocket's authentication context will not be used * in any case, even if they are enabled. *

+ * Note that the standard list of cipher suite names may be found in the + * + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list or might not + * use the recommended name for a certain cipher suite. + *

* SSLSockets returned from accept() * inherit this setting. * @@ -236,6 +251,13 @@ public abstract class SSLServerSocket extends ServerSocket { * be enabled by default, since this list may include cipher suites which * do not meet quality of service requirements for those defaults. Such * cipher suites are useful in specialized applications. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getEnabledCipherSuites() diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java index fea47ba0cd3..3629aaef3c7 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, 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 @@ -123,6 +123,13 @@ public abstract class SSLServerSocketFactory extends ServerSocketFactory * will use one of these cipher suites. The minimum quality of service * for these defaults requires confidentiality protection and server * authentication (that is, no anonymous cipher suites). + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @see #getSupportedCipherSuites() * @return array of the cipher suites enabled by default @@ -137,6 +144,13 @@ public abstract class SSLServerSocketFactory extends ServerSocketFactory * be enabled by default, since this list may include cipher suites which * do not meet quality of service requirements for those defaults. Such * cipher suites are useful in specialized applications. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getDefaultCipherSuites() diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java index 93c7ec01ab7..daaefe08ec7 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java @@ -265,6 +265,13 @@ public abstract class SSLSocket extends Socket * be enabled by default, since this list may include cipher suites which * do not meet quality of service requirements for those defaults. Such * cipher suites might be useful in specialized applications. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getEnabledCipherSuites() @@ -284,6 +291,13 @@ public abstract class SSLSocket extends Socket * or the requisite certificates (and private keys) for the suite are * not available, or an anonymous suite is enabled but authentication * is required. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @return an array of cipher suite names * @see #getSupportedCipherSuites() @@ -300,6 +314,14 @@ public abstract class SSLSocket extends Socket * fail. Following a successful call to this method, only suites * listed in the suites parameter are enabled for use. *

+ * Note that the standard list of cipher suite names may be found in the + * + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation. Providers + * may support cipher suite names not found in this list or might not + * use the recommended name for a certain cipher suite. + *

* See {@link #getEnabledCipherSuites()} for more information * on why a specific ciphersuite may never be used on a connection. * diff --git a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java index 6375a52a1b0..d504e1d7a3d 100644 --- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java +++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, 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 @@ -148,6 +148,13 @@ public abstract class SSLSocketFactory extends SocketFactory * will use one of these cipher suites. The minimum quality of service * for these defaults requires confidentiality protection and server * authentication (that is, no anonymous cipher suites). + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @see #getSupportedCipherSuites() * @return array of the cipher suites enabled by default @@ -160,6 +167,13 @@ public abstract class SSLSocketFactory extends SocketFactory * be enabled by default, since this list may include cipher suites which * do not meet quality of service requirements for those defaults. Such * cipher suites are useful in specialized applications. + *

+ * The returned array includes cipher suites from the list of standard + * cipher suite names in the + * JSSE Cipher Suite Names section of the Java Cryptography + * Architecture Standard Algorithm Name Documentation, and may also + * include other cipher suites that the provider supports. * * @see #getDefaultCipherSuites() * @return an array of cipher suite names From 692e9367d01a252d1a0b27e80c9e300a56549b82 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 18 Aug 2016 21:01:21 +0000 Subject: [PATCH 089/115] Added tag jdk-9+132 for changeset a11ec8919fef --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index ada9a1ad431..dd85a0e3b2b 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -534,3 +534,4 @@ adc8c84b7cf8c540d920182f78a2bc982366432a jdk-9+126 e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129 7d54c7056328b6a2bf4877458b8f4d8cd870f93b jdk-9+130 943bf73b49c33c2d7cbd796f6a4ae3c7a00ae932 jdk-9+131 +713951c08aa26813375175c2ab6cc99ff2a56903 jdk-9+132 From b9f442e44bacf7f2cf37a6678b805cbd80f98c28 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 18 Aug 2016 21:01:21 +0000 Subject: [PATCH 090/115] Added tag jdk-9+132 for changeset ccfc90be04f8 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index 1e46a9e1c46..2ba88ee0421 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -374,3 +374,4 @@ c7f5ba08fcd4b8416e62c21229f9a07c95498919 jdk-9+126 c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129 77f9692d5976ae155773dd3e07533616bb95bae1 jdk-9+130 f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131 +1ab4b9399c4cba584f66c1c088188f2f565fbf9c jdk-9+132 From 012327f7c163e534490259413ea1b7ea527123a9 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 18 Aug 2016 21:01:21 +0000 Subject: [PATCH 091/115] Added tag jdk-9+132 for changeset cbba9772b2be --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 9c7560ce460..2ab754ea198 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -374,3 +374,4 @@ b30ae794d974d7dd3eb4e84203f70021823fa6c6 jdk-9+128 f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129 d94d54a3192fea79234c3ac55cd0b4052d45e954 jdk-9+130 8728756c2f70a79a90188f4019cfd6b9a275765c jdk-9+131 +a24702d4d5ab0015a5c553ed57f66fce7d85155e jdk-9+132 From 66b3dac5b0becae4191853aeb568923563275bbc Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 18 Aug 2016 21:01:22 +0000 Subject: [PATCH 092/115] Added tag jdk-9+132 for changeset 5542e4584972 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index b82ddf4e57c..d0c1a581878 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -374,3 +374,4 @@ c40c8739bcdc88892ff58ebee3fd8a3f287be94d jdk-9+123 47699aa2e69ec2702542dc73eb01de3bfb61aea0 jdk-9+129 6c827500e34587061af97ad6fef0e859280255c5 jdk-9+130 8c57f4c293bbc5609928308a6d91ba765760b5f9 jdk-9+131 +d5c70818cd8a82e76632c8c815bdb4f75f53aeaf jdk-9+132 From 29a6fff092ca5da4fe0480bc5d20e05bb1da8b2f Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 18 Aug 2016 21:01:24 +0000 Subject: [PATCH 093/115] Added tag jdk-9+132 for changeset bdadcb4724d1 --- nashorn/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/nashorn/.hgtags b/nashorn/.hgtags index fdc1707bfb7..aa139484a6f 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -365,3 +365,4 @@ ff07be6106fa56b72c163244f45a3ecb4c995564 jdk-9+127 68020a486500422e2c8b94b0f35cafe54c9e219a jdk-9+129 0de67a63e2c73781ecf5979a2f3aa9619a445c37 jdk-9+130 ee77c6b3713ab293e027ac3ea1cc16f86dac535f jdk-9+131 +55a75af751dfe44039baef2b762ee7347021025b jdk-9+132 From 07e13d14af79e065217d9f7d0da04fc6bbb57567 Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Thu, 18 Aug 2016 17:51:40 -0400 Subject: [PATCH 094/115] 8164394: Minor correction in Java API doc for DataSource Reviewed-by: darcy, jjg, tbell --- jdk/src/java.se.ee/share/classes/module-info.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/jdk/src/java.se.ee/share/classes/module-info.java b/jdk/src/java.se.ee/share/classes/module-info.java index d611f5ef522..6d4a11fc70a 100644 --- a/jdk/src/java.se.ee/share/classes/module-info.java +++ b/jdk/src/java.se.ee/share/classes/module-info.java @@ -23,12 +23,6 @@ * questions. */ -/** - * Defines the full API of the Java SE Platform. - *

- * This module requires {@code java.se} and supplements it with modules - * that define CORBA and Java EE APIs. These modules are upgradeable. - */ module java.se.ee { requires public java.se; From de29b8a394c25ed231f1b8c434b2fe02703a7dcd Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Fri, 19 Aug 2016 01:41:54 +0300 Subject: [PATCH 095/115] 8153438: Avoid repeated "Please insert a smart card" popup windows Reviewed-by: vinnie, valeriep --- .../windows/native/libsunmscapi/security.cpp | 126 +++++++++++------- 1 file changed, 76 insertions(+), 50 deletions(-) diff --git a/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp b/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp index 19f40b74d28..44c3f1a8c44 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp +++ b/jdk/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp @@ -358,38 +358,50 @@ JNIEXPORT void JNICALL Java_sun_security_mscapi_KeyStore_loadKeysOrCertificateCh BOOL bHasNoPrivateKey = FALSE; DWORD dwPublicKeyLength = 0; - if (::CryptAcquireCertificatePrivateKey(pCertContext, NULL, NULL, - &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE) + // First, probe it silently + if (::CryptAcquireCertificatePrivateKey(pCertContext, CRYPT_ACQUIRE_SILENT_FLAG, NULL, + &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE + && GetLastError() != NTE_SILENT_CONTEXT) { bHasNoPrivateKey = TRUE; - - } else { - // Private key is available - - BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey); - - // Skip certificate if cannot find private key - if (bGetUserKey == FALSE) - { - if (bCallerFreeProv) - ::CryptReleaseContext(hCryptProv, NULL); - - continue; + } + else + { + if (bCallerFreeProv == TRUE) { + ::CryptReleaseContext(hCryptProv, NULL); + bCallerFreeProv = FALSE; } - // Set cipher mode to ECB - DWORD dwCipherMode = CRYPT_MODE_ECB; - ::CryptSetKeyParam(hUserKey, KP_MODE, (BYTE*)&dwCipherMode, NULL); + // Second, acquire the key normally (not silently) + if (::CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, + &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE) + { + bHasNoPrivateKey = TRUE; + } + else + { + // Private key is available + BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey); + // Skip certificate if cannot find private key + if (bGetUserKey == FALSE) { + if (bCallerFreeProv) + ::CryptReleaseContext(hCryptProv, NULL); + continue; + } - // If the private key is present in smart card, we may not be able to - // determine the key length by using the private key handle. However, - // since public/private key pairs must have the same length, we could - // determine the key length of the private key by using the public key - // in the certificate. - dwPublicKeyLength = ::CertGetPublicKeyLength(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - &(pCertContext->pCertInfo->SubjectPublicKeyInfo)); + // Set cipher mode to ECB + DWORD dwCipherMode = CRYPT_MODE_ECB; + ::CryptSetKeyParam(hUserKey, KP_MODE, (BYTE*)&dwCipherMode, NULL); + // If the private key is present in smart card, we may not be able to + // determine the key length by using the private key handle. However, + // since public/private key pairs must have the same length, we could + // determine the key length of the private key by using the public key + // in the certificate. + dwPublicKeyLength = ::CertGetPublicKeyLength(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, + &(pCertContext->pCertInfo->SubjectPublicKeyInfo)); + } } PCCERT_CHAIN_CONTEXT pCertChainContext = NULL; @@ -398,8 +410,7 @@ JNIEXPORT void JNICALL Java_sun_security_mscapi_KeyStore_loadKeysOrCertificateCh // if (GetCertificateChain(OID_EKU_ANY, pCertContext, &pCertChainContext)) { - - for (unsigned int i=0; i < pCertChainContext->cChain; i++) + for (DWORD i = 0; i < pCertChainContext->cChain; i++) { // Found cert chain PCERT_SIMPLE_CHAIN rgpChain = @@ -449,6 +460,7 @@ JNIEXPORT void JNICALL Java_sun_security_mscapi_KeyStore_loadKeysOrCertificateCh // cert collection env->CallVoidMethod(obj, mGenCert, byteArray, jArrayList); } + if (bHasNoPrivateKey) { // Generate certificate chain and store into cert chain @@ -1367,43 +1379,57 @@ JNIEXPORT jlong JNICALL Java_sun_security_mscapi_RSACipher_getKeyFromCert HCRYPTPROV hCryptProv = NULL; HCRYPTKEY hKey = NULL; DWORD dwKeySpec; + BOOL bCallerFreeProv = FALSE; + BOOL bRes; __try { if (usePrivateKey == JNI_TRUE) { // Locate the key container for the certificate's private key - if (!(::CryptAcquireCertificatePrivateKey( - (PCCERT_CONTEXT) pCertContext, 0, NULL, &hCryptProv, - &dwKeySpec, NULL))) { + // First, probe it silently + bRes = ::CryptAcquireCertificatePrivateKey( + (PCCERT_CONTEXT) pCertContext, CRYPT_ACQUIRE_SILENT_FLAG, + NULL, &hCryptProv, &dwKeySpec, &bCallerFreeProv); + + if (bRes == FALSE && GetLastError() != NTE_SILENT_CONTEXT) + { + ThrowException(env, KEYSTORE_EXCEPTION, GetLastError()); + __leave; + } + + if (bCallerFreeProv == TRUE) { + ::CryptReleaseContext(hCryptProv, NULL); + bCallerFreeProv = FALSE; + } + + // Now, do it normally (not silently) + if (::CryptAcquireCertificatePrivateKey( + (PCCERT_CONTEXT) pCertContext, 0, NULL, &hCryptProv, + &dwKeySpec, &bCallerFreeProv) == FALSE) + { ThrowException(env, KEYSTORE_EXCEPTION, GetLastError()); __leave; } // Get a handle to the private key - if (!(::CryptGetUserKey(hCryptProv, dwKeySpec, &hKey))) { + if (::CryptGetUserKey(hCryptProv, dwKeySpec, &hKey) == FALSE) { ThrowException(env, KEY_EXCEPTION, GetLastError()); __leave; } - - } else { // use public key + } + else // use public key + { + bCallerFreeProv = TRUE; // Acquire a CSP context. - if(::CryptAcquireContext( - &hCryptProv, - "J2SE", - NULL, - PROV_RSA_FULL, - 0) == FALSE) + if (::CryptAcquireContext(&hCryptProv, "J2SE", NULL, + PROV_RSA_FULL, 0) == FALSE) { // If CSP context hasn't been created, create one. // - if (::CryptAcquireContext( - &hCryptProv, - "J2SE", - NULL, - PROV_RSA_FULL, - CRYPT_NEWKEYSET) == FALSE) + if (::CryptAcquireContext(&hCryptProv, "J2SE", NULL, + PROV_RSA_FULL, CRYPT_NEWKEYSET) == FALSE) { ThrowException(env, KEYSTORE_EXCEPTION, GetLastError()); __leave; @@ -1411,10 +1437,10 @@ JNIEXPORT jlong JNICALL Java_sun_security_mscapi_RSACipher_getKeyFromCert } // Import the certificate's public key into the key container - if (!(::CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING, - &(((PCCERT_CONTEXT) pCertContext)->pCertInfo->SubjectPublicKeyInfo), - &hKey))) { - + if (::CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING, + &(((PCCERT_CONTEXT) pCertContext)->pCertInfo->SubjectPublicKeyInfo), + &hKey) == FALSE) + { ThrowException(env, KEY_EXCEPTION, GetLastError()); __leave; } @@ -1425,7 +1451,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_mscapi_RSACipher_getKeyFromCert //-------------------------------------------------------------------- // Clean up. - if (hCryptProv) + if (bCallerFreeProv == TRUE && hCryptProv != NULL) ::CryptReleaseContext(hCryptProv, 0); } From d7fd2d916640e5ed9f0c6683ec4ababa4ab4386b Mon Sep 17 00:00:00 2001 From: "Tagir F. Valeev" Date: Thu, 18 Aug 2016 17:30:49 -0700 Subject: [PATCH 096/115] 8164189: Collectors.toSet() parallel performance improvement Reviewed-by: shade, psandoz --- .../share/classes/java/util/stream/Collectors.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jdk/src/java.base/share/classes/java/util/stream/Collectors.java b/jdk/src/java.base/share/classes/java/util/stream/Collectors.java index da80728f255..018bb5fc1b6 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/Collectors.java +++ b/jdk/src/java.base/share/classes/java/util/stream/Collectors.java @@ -295,7 +295,13 @@ public final class Collectors { public static Collector> toSet() { return new CollectorImpl<>((Supplier>) HashSet::new, Set::add, - (left, right) -> { left.addAll(right); return left; }, + (left, right) -> { + if (left.size() < right.size()) { + right.addAll(left); return right; + } else { + left.addAll(right); return left; + } + }, CH_UNORDERED_ID); } From c846a862ee4ee138de13688013924581182c27d7 Mon Sep 17 00:00:00 2001 From: Valerie Peng Date: Fri, 19 Aug 2016 06:27:54 +0000 Subject: [PATCH 097/115] 8130181: Deprecate java.security.Provider(String, double, String), add Provider(Strin Added Provider constructor which uses version String and use sun.security.util.PROVIDER_VER Reviewed-by: weijun --- .../classes/apple/security/AppleProvider.java | 5 +- .../com/sun/crypto/provider/SunJCE.java | 5 +- .../classes/java/security/AuthProvider.java | 19 ++- .../share/classes/java/security/Provider.java | 122 ++++++++++++++++-- .../sun/security/jca/ProviderList.java | 2 +- .../classes/sun/security/provider/MD4.java | 6 +- .../classes/sun/security/provider/Sun.java | 6 +- .../provider/VerificationProvider.java | 6 +- .../classes/sun/security/rsa/SunRsaSign.java | 5 +- .../classes/sun/security/ssl/JsseJce.java | 3 +- .../classes/sun/security/ssl/SunJSSE.java | 5 +- .../sun/security/util/SecurityConstants.java | 6 +- .../provider/certpath/ldap/JdkLDAP.java | 5 +- .../sun/security/jgss/SunProvider.java | 3 +- .../jgss/wrapper/SunNativeProvider.java | 5 +- .../com/sun/security/sasl/Provider.java | 5 +- .../javax/smartcardio/TerminalFactory.java | 2 +- .../sun/security/smartcardio/SunPCSC.java | 5 +- .../jcp/xml/dsig/internal/dom/XMLDSigRI.java | 11 +- .../share/classes/sun/security/ec/SunEC.java | 6 +- .../sun/security/mscapi/SunMSCAPI.java | 3 +- .../sun/security/pkcs11/SunPKCS11.java | 6 +- .../security/ucrypto/UcryptoProvider.java | 4 +- .../sun/security/sasl/gsskerb/JdkSASL.java | 6 +- .../sun/net/ssl/SSLSecurity/ProviderTest.java | 6 +- .../java/security/KeyFactory/Failover.java | 8 +- .../security/KeyPairGenerator/Failover.java | 8 +- .../java/security/KeyStore/EntryMethods.java | 6 +- .../security/KeyStore/KeyStoreBuilder.java | 6 +- .../GetInstance/GetInstanceProvider.java | 4 +- .../Provider/CaseSensitiveServices.java | 6 +- .../security/Provider/ChangeProviders.java | 6 +- jdk/test/java/security/Provider/Equals.java | 14 +- .../java/security/Provider/GetInstance.java | 10 +- .../security/Provider/ProviderInfoCheck.java | 15 +-- .../security/Provider/RemoveProvider.java | 10 +- .../security/Provider/SupportsParameter.java | 6 +- .../Provider/TestSecurityProvider.java | 6 +- jdk/test/java/security/Provider/Turkish.java | 6 +- .../SecureClassLoader/DefineClass.java | 6 +- .../java/security/Security/AddProvider.java | 6 +- .../provider/HashProvider.java | 4 +- .../security/Security/SynchronizedAccess.java | 8 +- .../removing/RemoveProviderByIdentity.java | 8 +- .../Signature/SignatureGetAlgorithm.java | 6 +- .../cert/CertPathBuilder/StubProvider.java | 6 +- .../javax/crypto/JceSecurity/MyProvider.java | 6 +- .../crypto/SecretKeyFactory/Provider1.java | 6 +- .../crypto/SecretKeyFactory/Provider2.java | 6 +- .../pluggability/CheckSSLContextExport.java | 6 +- .../Configuration/GetInstanceProvider.java | 4 +- jdk/test/jdk/security/jarsigner/Function.java | 6 +- .../SecureRandom/AbstractDrbg/SpecTest.java | 18 +-- .../org/test/dummy/DummyProvider.java | 6 +- .../AlgorithmId/ExtensibleAlgorithmId.java | 6 +- 55 files changed, 312 insertions(+), 164 deletions(-) diff --git a/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java b/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java index 12dc2592a3b..3b712846d45 100644 --- a/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java +++ b/jdk/src/java.base/macosx/classes/apple/security/AppleProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, 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,6 +26,7 @@ package apple.security; import java.security.*; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * The Apple Security Provider. @@ -74,7 +75,7 @@ public final class AppleProvider extends Provider { public AppleProvider() { /* We are the Apple provider */ - super("Apple", 9.0d, info); + super("Apple", PROVIDER_VER, info); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java b/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java index e7ab016b5d9..e44a8476dc2 100644 --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.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 @@ -28,6 +28,7 @@ package com.sun.crypto.provider; import java.security.AccessController; import java.security.Provider; import java.security.SecureRandom; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** @@ -104,7 +105,7 @@ public final class SunJCE extends Provider { public SunJCE() { /* We are the "SunJCE" provider */ - super("SunJCE", 9.0d, info); + super("SunJCE", PROVIDER_VER, info); final String BLOCK_MODES = "ECB|CBC|PCBC|CTR|CTS|CFB|OFB" + "|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64" + diff --git a/jdk/src/java.base/share/classes/java/security/AuthProvider.java b/jdk/src/java.base/share/classes/java/security/AuthProvider.java index efa21641cb3..395943b8ff3 100644 --- a/jdk/src/java.base/share/classes/java/security/AuthProvider.java +++ b/jdk/src/java.base/share/classes/java/security/AuthProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, 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 @@ -50,9 +50,24 @@ public abstract class AuthProvider extends Provider { * @param name the provider name. * @param version the provider version number. * @param info a description of the provider and its services. + * @deprecated use {@link #AuthProvider(String, String, String)} instead. */ + @Deprecated(since="9") protected AuthProvider(String name, double version, String info) { - super(name, version, info); + super(name, Double.toString(version), info); + } + + /** + * Constructs a provider with the specified name, version string, + * and information. + * + * @param name the provider name. + * @param versionStr the provider version string. + * @param info a description of the provider and its services. + * @since 9 + */ + protected AuthProvider(String name, String versionStr, String info) { + super(name, versionStr, info); } /** diff --git a/jdk/src/java.base/share/classes/java/security/Provider.java b/jdk/src/java.base/share/classes/java/security/Provider.java index 1d9d072b700..f53660346a5 100644 --- a/jdk/src/java.base/share/classes/java/security/Provider.java +++ b/jdk/src/java.base/share/classes/java/security/Provider.java @@ -67,14 +67,14 @@ import java.util.function.Function; * {@code Provider.id name} * {@code String.valueOf(provider.getName())} * {@code Provider.id version} - * {@code String.valueOf(provider.getVersion())} + * {@code String.valueOf(provider.getVersionStr())} * {@code Provider.id info} {@code String.valueOf(provider.getInfo())} * {@code Provider.id className} * {@code provider.getClass().getName()} * * - *

Each provider has a name and a version number. A provider normally + *

Each provider has a name and a version string. A provider normally * identifies itself with a file named {@code java.security.Provider} * in the resource directory {@code META-INF/services}. * Security providers are looked up via the {@link ServiceLoader} mechanism @@ -102,11 +102,10 @@ import java.util.function.Function; public abstract class Provider extends Properties { // Declare serialVersionUID to be compatible with JDK1.1 - static final long serialVersionUID = -4298000515446427739L; + private static final long serialVersionUID = -4298000515446427739L; private static final sun.security.util.Debug debug = - sun.security.util.Debug.getInstance - ("provider", "Provider"); + sun.security.util.Debug.getInstance("provider", "Provider"); /** * The provider name. @@ -129,6 +128,12 @@ public abstract class Provider extends Properties { */ private double version; + /** + * The provider version string. + * + * @serial + */ + private String versionStr; private transient Set> entrySet = null; private transient int entrySetCallCount = 0; @@ -174,19 +179,83 @@ public abstract class Provider extends Properties { } } + private static double parseVersionStr(String s) { + try { + int firstDotIdx = s.indexOf('.'); + int nextDotIdx = s.indexOf('.', firstDotIdx + 1); + if (nextDotIdx != -1) { + s = s.substring(0, nextDotIdx); + } + int endIdx = s.indexOf('-'); + if (endIdx > 0) { + s = s.substring(0, endIdx); + } + endIdx = s.indexOf('+'); + if (endIdx > 0) { + s = s.substring(0, endIdx); + } + return Double.parseDouble(s); + } catch (NullPointerException | NumberFormatException e) { + return 0d; + } + } + /** * Constructs a provider with the specified name, version number, - * and information. + * and information. Calling this constructor is equivalent to call the + * {@link #Provider(String, String, String)} with {@code name} + * name, {@code Double.toString(version)}, and {@code info}. * * @param name the provider name. * * @param version the provider version number. * * @param info a description of the provider and its services. + * + * @deprecated use {@link #Provider(String, String, String)} instead. */ + @Deprecated(since="9") protected Provider(String name, double version, String info) { this.name = name; this.version = version; + this.versionStr = Double.toString(version); + this.info = info; + putId(); + initialized = true; + } + + /** + * Constructs a provider with the specified name, version string, + * and information. + * + *

The version string contains a version number optionally followed + * by other information separated by one of the characters of '+', '-'. + * + * The format for the version number is: + * + *

+     *     ^[0-9]+(\.[0-9]+)*
+     * 
+ * + *

In order to return the version number in a double, when there are + * more than two components (separated by '.' as defined above), only + * the first two components are retained. The resulting string is then + * passed to {@link Double#valueOf(String)} to generate version number, + * i.e. {@link #getVersion}. + *

If the conversion failed, value 0 will be used. + * + * @param name the provider name. + * + * @param versionStr the provider version string. + * + * @param info a description of the provider and its services. + * + * @since 9 + */ + protected Provider(String name, String versionStr, String info) { + this.name = name; + this.versionStr = versionStr; + this.version = parseVersionStr(versionStr); this.info = info; putId(); initialized = true; @@ -250,11 +319,25 @@ public abstract class Provider extends Properties { * Returns the version number for this provider. * * @return the version number for this provider. + * + * @deprecated use {@link #getVersionStr} instead. */ + @Deprecated(since="9") public double getVersion() { return version; } + /** + * Returns the version string for this provider. + * + * @return the version string for this provider. + * + * @since 9 + */ + public String getVersionStr() { + return versionStr; + } + /** * Returns a human-readable description of the provider and its * services. This may return an HTML page, with relevant links. @@ -266,14 +349,14 @@ public abstract class Provider extends Properties { } /** - * Returns a string with the name and the version number + * Returns a string with the name and the version string * of this provider. * - * @return the string with the name and the version number + * @return the string with the name and the version string * for this provider. */ public String toString() { - return name + " version " + version; + return name + " version " + versionStr; } /* @@ -787,11 +870,21 @@ public abstract class Provider extends Properties { private void putId() { // note: name and info may be null super.put("Provider.id name", String.valueOf(name)); - super.put("Provider.id version", String.valueOf(version)); + super.put("Provider.id version", String.valueOf(versionStr)); super.put("Provider.id info", String.valueOf(info)); super.put("Provider.id className", this.getClass().getName()); } + /** + * Reads the {@code ObjectInputStream} for the default serializable fields. + * If the serialized field {@code versionStr} is found in the STREAM FIELDS, + * its String value will be used to populate both the version string and + * version number. If {@code versionStr} is not found, but {@code version} + * is, then its double value will be used to populate both fields. + * + * @param in the {@code ObjectInputStream} to read + * @serial + */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Map copy = new HashMap<>(); @@ -800,6 +893,13 @@ public abstract class Provider extends Properties { } defaults = null; in.defaultReadObject(); + if (this.versionStr == null) { + // set versionStr based on version when not found in serialized bytes + this.versionStr = Double.toString(this.version); + } else { + // otherwise, set version based on versionStr + this.version = parseVersionStr(this.versionStr); + } implClear(); initialized = true; putAll(copy); @@ -1913,7 +2013,5 @@ public abstract class Provider extends Properties { return provider.getName() + ": " + type + "." + algorithm + " -> " + className + aString + attrs + "\r\n"; } - } - } diff --git a/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java b/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java index 971c4930b7e..81f8a6b8ef2 100644 --- a/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java +++ b/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java @@ -76,7 +76,7 @@ public final class ProviderList { // dummy provider object to use during initialization // used to avoid explicit null checks in various places private static final Provider EMPTY_PROVIDER = - new Provider("##Empty##", 1.0d, "initialization in progress") { + new Provider("##Empty##", "1.0", "initialization in progress") { private static final long serialVersionUID = 1151354171352296389L; // override getService() to return null slightly faster public Service getService(String type, String algorithm) { diff --git a/jdk/src/java.base/share/classes/sun/security/provider/MD4.java b/jdk/src/java.base/share/classes/sun/security/provider/MD4.java index 2df2d42c63e..3c94f6ce66d 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/MD4.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/MD4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -28,6 +28,7 @@ package sun.security.provider; import java.security.*; import static sun.security.provider.ByteArrayAccess.*; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * The MD4 class is used to compute an MD4 message digest over a given @@ -65,7 +66,8 @@ public final class MD4 extends DigestBase { private static final Provider md4Provider; static { - md4Provider = new Provider("MD4Provider", 9.0d, "MD4 MessageDigest") { + md4Provider = new Provider("MD4Provider", PROVIDER_VER, + "MD4 MessageDigest") { private static final long serialVersionUID = -8850464997518327965L; }; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.base/share/classes/sun/security/provider/Sun.java b/jdk/src/java.base/share/classes/sun/security/provider/Sun.java index f2776f56a35..4de677d4b87 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/Sun.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/Sun.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -29,6 +29,8 @@ import java.util.*; import java.security.*; import sun.security.action.PutAllAction; +import static sun.security.util.SecurityConstants.PROVIDER_VER; + /** * The SUN Security Provider. @@ -47,7 +49,7 @@ public final class Sun extends Provider { public Sun() { /* We are the SUN provider */ - super("SUN", 9.0d, INFO); + super("SUN", PROVIDER_VER, INFO); // if there is no security manager installed, put directly into // the provider. Otherwise, create a temporary map and use a diff --git a/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java b/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java index 65944e59c1e..f4016a867f7 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/VerificationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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,8 @@ import java.security.*; import sun.security.action.PutAllAction; import sun.security.rsa.SunRsaSignEntries; +import static sun.security.util.SecurityConstants.PROVIDER_VER; + /** * Provider used for verification of signed JAR files *if* the Sun and @@ -61,7 +63,7 @@ public final class VerificationProvider extends Provider { } public VerificationProvider() { - super("SunJarVerification", 9.0d, "Jar Verification Provider"); + super("SunJarVerification", PROVIDER_VER, "Jar Verification Provider"); // register all algorithms normally registered by the Sun and SunRsaSign // providers, but only if they are missing if (ACTIVE == false) { diff --git a/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java b/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java index beacf423dde..e80634c369b 100644 --- a/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java +++ b/jdk/src/java.base/share/classes/sun/security/rsa/SunRsaSign.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, 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 @@ -30,6 +30,7 @@ import java.util.*; import java.security.*; import sun.security.action.PutAllAction; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Provider class for the RSA signature provider. Supports RSA keyfactory, @@ -43,7 +44,7 @@ public final class SunRsaSign extends Provider { private static final long serialVersionUID = 866040293550393045L; public SunRsaSign() { - super("SunRsaSign", 9.0d, "Sun RSA signature provider"); + super("SunRsaSign", PROVIDER_VER, "Sun RSA signature provider"); // if there is no security manager installed, put directly into // the provider. Otherwise, create a temporary map and use a diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java b/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java index 76b9da5973c..32816137437 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/JsseJce.java @@ -44,6 +44,7 @@ import sun.security.jca.ProviderList; import sun.security.util.ECUtil; import static sun.security.ssl.SunJSSE.cryptoProvider; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * This class contains a few static methods for interaction with the JCA/JCE @@ -90,7 +91,7 @@ final class JsseJce { private static final long serialVersionUID = -3284138292032213752L; SunCertificates(final Provider p) { - super("SunCertificates", 9.0d, "SunJSSE internal"); + super("SunCertificates", PROVIDER_VER, "SunJSSE internal"); AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java b/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java index 6e66c00e2af..3ef37b798a1 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java @@ -27,6 +27,7 @@ package sun.security.ssl; import java.security.*; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * The JSSE provider. @@ -104,7 +105,7 @@ public abstract class SunJSSE extends java.security.Provider { // standard constructor protected SunJSSE() { - super("SunJSSE", 9.0d, info); + super("SunJSSE", PROVIDER_VER, info); subclassCheck(); if (Boolean.TRUE.equals(fips)) { throw new ProviderException @@ -132,7 +133,7 @@ public abstract class SunJSSE extends java.security.Provider { private SunJSSE(java.security.Provider cryptoProvider, String providerName) { - super("SunJSSE", 9.0d, fipsInfo + providerName + ")"); + super("SunJSSE", PROVIDER_VER, fipsInfo + providerName + ")"); subclassCheck(); if (cryptoProvider == null) { // Calling Security.getProvider() will cause other providers to be diff --git a/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java b/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java index 4a928b1d174..c7099aca30f 100644 --- a/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java +++ b/jdk/src/java.base/share/classes/sun/security/util/SecurityConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, 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 @@ -33,6 +33,7 @@ import java.security.Permission; import java.security.BasicPermission; import java.security.SecurityPermission; import java.security.AllPermission; +import sun.security.action.GetPropertyAction; /** * Permission constants and string constants used to create permissions @@ -145,4 +146,7 @@ public final class SecurityConstants { // java.lang.SecurityManager public static final SocketPermission LOCAL_LISTEN_PERMISSION = new SocketPermission("localhost:0", SOCKET_LISTEN_ACTION); + + public static final String PROVIDER_VER = + GetPropertyAction.privilegedGetProperty("java.specification.version"); } diff --git a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java index 10895e8f000..419b99887d1 100644 --- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java +++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.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 @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.security.*; import java.security.cert.CertStoreParameters; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Provider class for the JdkLDAP provider. @@ -69,7 +70,7 @@ public final class JdkLDAP extends Provider { } public JdkLDAP() { - super("JdkLDAP", 9.0d, "JdkLDAP Provider (implements LDAP CertStore)"); + super("JdkLDAP", PROVIDER_VER, "JdkLDAP Provider (implements LDAP CertStore)"); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java index 3e664d7cccc..1f0b64b064b 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/SunProvider.java @@ -33,6 +33,7 @@ import java.security.InvalidParameterException; import java.security.ProviderException; import sun.security.jgss.krb5.Krb5MechFactory; import sun.security.jgss.spnego.SpNegoMechFactory; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Defines the Sun JGSS provider. @@ -99,7 +100,7 @@ public final class SunProvider extends Provider { public SunProvider() { /* We are the Sun JGSS provider */ - super("SunJGSS", 9.0d, INFO); + super("SunJGSS", PROVIDER_VER, INFO); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java index ea82637bd7e..baa3d1375fd 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 java.security.AccessController; import java.security.PrivilegedAction; import org.ietf.jgss.Oid; import sun.security.action.PutAllAction; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Defines the Sun NativeGSS provider for plugging in the @@ -120,7 +121,7 @@ public final class SunNativeProvider extends Provider { public SunNativeProvider() { /* We are the Sun NativeGSS provider */ - super(NAME, 9.0d, INFO); + super(NAME, PROVIDER_VER, INFO); if (MECH_MAP != null) { AccessController.doPrivileged(new PutAllAction(this, MECH_MAP)); diff --git a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java index 7066869597d..24497239368 100644 --- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java +++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/Provider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, 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 @@ -29,6 +29,7 @@ import java.security.PrivilegedAction; import java.security.NoSuchAlgorithmException; import java.security.InvalidParameterException; import java.security.ProviderException; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * The SASL provider. @@ -98,7 +99,7 @@ public final class Provider extends java.security.Provider { } public Provider() { - super("SunSASL", 9.0d, info); + super("SunSASL", PROVIDER_VER, info); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java b/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java index 0e810845f24..e37fe33a74f 100644 --- a/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java +++ b/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java @@ -134,7 +134,7 @@ public final class TerminalFactory { private static final long serialVersionUID = 2745808869881593918L; final static Provider INSTANCE = new NoneProvider(); private NoneProvider() { - super("None", 1.0d, "none"); + super("None", "1.0", "none"); } } diff --git a/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java b/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java index ad75eeeaf97..08a25c4f7e4 100644 --- a/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java +++ b/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/SunPCSC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -28,6 +28,7 @@ package sun.security.smartcardio; import java.security.*; import javax.smartcardio.*; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Provider object for PC/SC. @@ -65,7 +66,7 @@ public final class SunPCSC extends Provider { } public SunPCSC() { - super("SunPCSC", 9.0d, "Sun PC/SC provider"); + super("SunPCSC", PROVIDER_VER, "Sun PC/SC provider"); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java index a95a833ed32..37b656294b7 100644 --- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java +++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java @@ -28,7 +28,7 @@ * =========================================================================== */ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: XMLDSigRI.java 1400021 2012-10-19 10:16:04Z coheigea $ @@ -59,6 +59,13 @@ public final class XMLDSigRI extends Provider { "C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, " + "XPath2, XSLT TransformServices)"; + private static final String VER = + AccessController.doPrivileged(new PrivilegedAction<>() { + public String run() { + return System.getProperty("java.specification.version"); + } + }); + private static final class ProviderService extends Provider.Service { ProviderService(Provider p, String type, String algo, String cn) { @@ -129,7 +136,7 @@ public final class XMLDSigRI extends Provider { public XMLDSigRI() { /* We are the XMLDSig provider */ - super("XMLDSig", 9.0d, INFO); + super("XMLDSig", VER, INFO); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java b/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java index 5141f449add..84b4df581aa 100644 --- a/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java +++ b/jdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 java.util.regex.Pattern; import sun.security.util.CurveDB; import sun.security.util.NamedCurve; import sun.security.util.ECParameters; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * Provider class for the Elliptic Curve provider. @@ -142,7 +143,8 @@ public final class SunEC extends Provider { } public SunEC() { - super("SunEC", 9.0d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)"); + super("SunEC", PROVIDER_VER, + "Sun Elliptic Curve provider (EC, ECDSA, ECDH)"); AccessController.doPrivileged(new PrivilegedAction() { public Void run() { putEntries(useFullImplementation); diff --git a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java index 94b8535ea8f..70165388eef 100644 --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java @@ -33,6 +33,7 @@ import java.security.InvalidParameterException; import java.security.ProviderException; import java.util.HashMap; import java.util.Arrays; +import static sun.security.util.SecurityConstants.PROVIDER_VER; /** * A Cryptographic Service Provider for the Microsoft Crypto API. @@ -124,7 +125,7 @@ public final class SunMSCAPI extends Provider { } public SunMSCAPI() { - super("SunMSCAPI", 9.0d, INFO); + super("SunMSCAPI", PROVIDER_VER, INFO); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java index 3aaf88e2e04..2946bdbdb52 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java @@ -44,6 +44,7 @@ import javax.security.auth.callback.TextOutputCallback; import sun.security.util.Debug; import sun.security.util.ResourcesMgr; +import static sun.security.util.SecurityConstants.PROVIDER_VER; import sun.security.pkcs11.Secmod.*; @@ -89,7 +90,8 @@ public final class SunPKCS11 extends AuthProvider { } public SunPKCS11() { - super("SunPKCS11", 9.0d, "Unconfigured and unusable PKCS11 provider"); + super("SunPKCS11", PROVIDER_VER, + "Unconfigured and unusable PKCS11 provider"); p11 = null; config = null; slotID = 0; @@ -132,7 +134,7 @@ public final class SunPKCS11 extends AuthProvider { // Used by Secmod SunPKCS11(Config c) { - super("SunPKCS11-" + c.getName(), 9.0d, c.getDescription()); + super("SunPKCS11-" + c.getName(), PROVIDER_VER, c.getDescription()); this.config = c; if (debug != null) { diff --git a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java index 661b50dafdb..090f96df227 100644 --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoProvider.java @@ -30,6 +30,8 @@ import java.io.File; import java.lang.reflect.Constructor; import java.util.*; import java.security.*; +import static sun.security.util.SecurityConstants.PROVIDER_VER; + /** * OracleUcrypto provider main class. @@ -196,7 +198,7 @@ public final class UcryptoProvider extends Provider { } public UcryptoProvider() { - super("OracleUcrypto", 9.0d, "Provider using Oracle Ucrypto API"); + super("OracleUcrypto", PROVIDER_VER, "Provider using Oracle Ucrypto API"); AccessController.doPrivileged(new PrivilegedAction<>() { public Void run() { diff --git a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.java b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.java index 96dc2db6a09..a03f6d7a957 100644 --- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.java +++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/JdkSASL.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 @@ -30,6 +30,8 @@ import java.security.Provider; import java.security.NoSuchAlgorithmException; import java.security.InvalidParameterException; import java.security.ProviderException; +import static sun.security.util.SecurityConstants.PROVIDER_VER; + /** * The JdkSASL provider class - @@ -73,7 +75,7 @@ public final class JdkSASL extends Provider { } public JdkSASL() { - super("JdkSASL", 9.0d, info); + super("JdkSASL", PROVIDER_VER, info); final Provider p = this; AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java b/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java index 43589cab6d9..e4d46d873a7 100644 --- a/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java +++ b/jdk/test/com/sun/net/ssl/SSLSecurity/ProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2013, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4667976 + * @bug 4667976 8130181 * @modules java.base/com.sun.net.ssl * @compile JavaxSSLContextImpl.java ComSSLContextImpl.java * JavaxTrustManagerFactoryImpl.java ComTrustManagerFactoryImpl.java @@ -85,7 +85,7 @@ class MyProvider extends Provider { public MyProvider() { - super("BRAD", 1.0, info); + super("BRAD", "1.0", info); AccessController.doPrivileged(new java.security.PrivilegedAction() { public Object run() { diff --git a/jdk/test/java/security/KeyFactory/Failover.java b/jdk/test/java/security/KeyFactory/Failover.java index 1bb9dff64f7..6242758a9cf 100644 --- a/jdk/test/java/security/KeyFactory/Failover.java +++ b/jdk/test/java/security/KeyFactory/Failover.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 @@ -23,7 +23,7 @@ /** * @test - * @bug 4894125 7054918 + * @bug 4894125 7054918 8130181 * @library ../testlibrary * @summary test that failover for KeyFactory works * @author Andreas Sterbenz @@ -96,14 +96,14 @@ public class Failover { private static class ProviderPass extends Provider { ProviderPass() { - super("Pass", 1.0d, "Pass"); + super("Pass", "1.0", "Pass"); put("KeyFactory.FOO" , "Failover$KeyFactoryPass"); } } private static class ProviderFail extends Provider { ProviderFail() { - super("Fail", 1.0d, "Fail"); + super("Fail", "1.0", "Fail"); put("KeyFactory.FOO" , "Failover$KeyFactoryFail"); put("KeyFactory.DSA" , "Failover$KeyFactoryFail"); } diff --git a/jdk/test/java/security/KeyPairGenerator/Failover.java b/jdk/test/java/security/KeyPairGenerator/Failover.java index 7366a7dd3f1..7fc8da8ccfc 100644 --- a/jdk/test/java/security/KeyPairGenerator/Failover.java +++ b/jdk/test/java/security/KeyPairGenerator/Failover.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 @@ -23,7 +23,7 @@ /** * @test - * @bug 4894125 7054918 + * @bug 4894125 7054918 8130181 * @library ../testlibrary * @summary test that failover for KeyPairGenerator works * @author Andreas Sterbenz @@ -110,14 +110,14 @@ public class Failover { private static class ProviderPass extends Provider { ProviderPass() { - super("Pass", 1.0d, "Pass"); + super("Pass", "1.0", "Pass"); put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorPass"); } } private static class ProviderFail extends Provider { ProviderFail() { - super("Fail", 1.0d, "Fail"); + super("Fail", "1.0", "Fail"); put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorFail"); put("KeyPairGenerator.DSA" , "Failover$KeyPairGeneratorFail"); put("KeyPairGenerator.RSA" , "Failover$KeyPairGeneratorFail"); diff --git a/jdk/test/java/security/KeyStore/EntryMethods.java b/jdk/test/java/security/KeyStore/EntryMethods.java index 434aaf0f724..38c1ab56ae8 100644 --- a/jdk/test/java/security/KeyStore/EntryMethods.java +++ b/jdk/test/java/security/KeyStore/EntryMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, 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 @@ -23,7 +23,7 @@ /* * @test 1.5, 03/06/24 - * @bug 4850376 8130850 + * @bug 4850376 8130850 8130181 * @summary Provide generic storage KeyStore storage facilities */ @@ -65,7 +65,7 @@ public class EntryMethods public static class FooEntry implements KeyStore.Entry { } public EntryMethods() throws Exception { - super("EntryMethods", 0.0, "EntryMethods"); + super("EntryMethods", "0.0", "EntryMethods"); pre15fis = new FileInputStream (System.getProperty("test.src") + "/EntryMethods.pre15.keystore"); diff --git a/jdk/test/java/security/KeyStore/KeyStoreBuilder.java b/jdk/test/java/security/KeyStore/KeyStoreBuilder.java index 2666069ee75..9add5198263 100644 --- a/jdk/test/java/security/KeyStore/KeyStoreBuilder.java +++ b/jdk/test/java/security/KeyStore/KeyStoreBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 4938922 4961104 5071293 6236533 + * @bug 4938922 4961104 5071293 6236533 8130181 * @summary verify that the KeyStore.Builder API works * @author Andreas Sterbenz */ @@ -219,7 +219,7 @@ public class KeyStoreBuilder { private static class MyProvider extends Provider { MyProvider() { - super("My", 1.0d, null); + super("My", "1.0", null); put("KeyStore.My", "KeyStoreBuilder$MyKeyStoreSpi"); } } diff --git a/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java b/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java index ea6fbc5618d..3bd6184aba0 100644 --- a/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java +++ b/jdk/test/java/security/Policy/GetInstance/GetInstanceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -27,7 +27,7 @@ public class GetInstanceProvider extends Provider { public GetInstanceProvider() { super("GetInstanceProvider", - 1, + "1", "GetInstanceProvider: Policy.GetInstancePolicySpi"); AccessController.doPrivileged(new PrivilegedAction() { diff --git a/jdk/test/java/security/Provider/CaseSensitiveServices.java b/jdk/test/java/security/Provider/CaseSensitiveServices.java index 50b6d66fad9..2a6676b4f58 100644 --- a/jdk/test/java/security/Provider/CaseSensitiveServices.java +++ b/jdk/test/java/security/Provider/CaseSensitiveServices.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 5097015 + * @bug 5097015 8130181 * @summary make sure we correctly treat Provider string entries as case insensitive * @author Andreas Sterbenz */ @@ -33,7 +33,7 @@ import java.security.Provider.*; public class CaseSensitiveServices extends Provider { CaseSensitiveServices() { - super("Foo", 1.0d, null); + super("Foo", "1.0", null); put("MessageDigest.Foo", "com.Foo"); put("mESSAGEdIGEST.fOO xYz", "aBc"); put("ALg.aliaS.MESSAGEdigest.Fu", "FoO"); diff --git a/jdk/test/java/security/Provider/ChangeProviders.java b/jdk/test/java/security/Provider/ChangeProviders.java index 8bfec8b3418..2c699cd70b1 100644 --- a/jdk/test/java/security/Provider/ChangeProviders.java +++ b/jdk/test/java/security/Provider/ChangeProviders.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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4856968 7054918 + * @bug 4856968 7054918 8130181 * @library ../testlibrary * @summary make sure add/insert/removeProvider() work correctly * @author Andreas Sterbenz @@ -36,7 +36,7 @@ import java.security.*; public class ChangeProviders extends Provider { private ChangeProviders() { - super("Foo", 47.23d, "none"); + super("Foo", "47.23", "none"); } private static int plen() { diff --git a/jdk/test/java/security/Provider/Equals.java b/jdk/test/java/security/Provider/Equals.java index 64a6182223e..81a52d12e20 100644 --- a/jdk/test/java/security/Provider/Equals.java +++ b/jdk/test/java/security/Provider/Equals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 4918769 + * @bug 4918769 8130181 * @summary make sure Provider.equals() behaves as expected with the id attributes * @author Andreas Sterbenz */ @@ -33,9 +33,9 @@ import java.security.*; public class Equals { public static void main(String[] args) throws Exception { - Provider p1 = new P1("foo", 1.0d, "foo"); - Provider p1b = new P1("foo", 1.0d, "foo"); - Provider p2 = new P2("foo", 1.0d, "foo"); + Provider p1 = new P1("foo", "1.0", "foo"); + Provider p1b = new P1("foo", "1.0", "foo"); + Provider p2 = new P2("foo", "1.0", "foo"); System.out.println(p1.entrySet()); if (p1.equals(p2)) { throw new Exception("Objects are equal"); @@ -55,13 +55,13 @@ public class Equals { } private static class P1 extends Provider { - P1(String name, double version, String info) { + P1(String name, String version, String info) { super(name, version, info); } } private static class P2 extends Provider { - P2(String name, double version, String info) { + P2(String name, String version, String info) { super(name, version, info); } } diff --git a/jdk/test/java/security/Provider/GetInstance.java b/jdk/test/java/security/Provider/GetInstance.java index 7440b99bf39..d0d6417f02b 100644 --- a/jdk/test/java/security/Provider/GetInstance.java +++ b/jdk/test/java/security/Provider/GetInstance.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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4856968 7054918 + * @bug 4856968 7054918 8130181 * @library ../testlibrary * @summary make sure getInstance() works correctly, including failover * and delayed provider selection for Signatures @@ -137,7 +137,7 @@ public class GetInstance { public static class FooProvider extends Provider { FooProvider() { - super("foo", 1.0d, "none"); + super("foo", "1.0", "none"); put("MessageDigest.foo", "GetInstance$FooDigest"); put("CertStore.foo", "GetInstance$FooStore"); put("Signature.foo", "GetInstance$FooSignatureSpi"); @@ -151,7 +151,7 @@ public class GetInstance { public static class BarProvider extends Provider { BarProvider() { - super("bar", 1.0d, "none"); + super("bar", "1.0", "none"); // all entries invalid for failover put("MessageDigest.bar", "GetInstance$FooKey"); put("Signature.bar", "GetInstance$FooKey"); @@ -164,7 +164,7 @@ public class GetInstance { public static class BazProvider extends Provider { BazProvider() { - super("baz", 1.0d, "none"); + super("baz", "1.0", "none"); put("MessageDigest.bar", "GetInstance$FooDigest"); put("CertStore.bar", "GetInstance$FooStore"); put("Signature.bar", "GetInstance$FooSignatureSpi"); diff --git a/jdk/test/java/security/Provider/ProviderInfoCheck.java b/jdk/test/java/security/Provider/ProviderInfoCheck.java index 55dfbed2852..e48bc414672 100644 --- a/jdk/test/java/security/Provider/ProviderInfoCheck.java +++ b/jdk/test/java/security/Provider/ProviderInfoCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6455351 + * @bug 6455351 8130181 * @summary Make sure the Provider.info entries have the correct values * after going through serialization/deserialization. * @author Valerie Peng @@ -68,18 +68,17 @@ public class ProviderInfoCheck { if (!p.getClass().getName().equalsIgnoreCase(value)) { throw new Exception("Test Failed: incorrect className!"); } - double dvalue = - Double.parseDouble((String) p.get("Provider.id version")); - if ((SampleProvider.VERSION != dvalue) || - p.getVersion() != dvalue) { - throw new Exception("Test Failed: incorrect version!"); + value = (String) p.get("Provider.id version"); + if (!SampleProvider.VERSION.equalsIgnoreCase(value) || + p.getVersionStr() != value) { + throw new Exception("Test Failed: incorrect versionStr!"); } System.out.println("Test Passed"); } private static class SampleProvider extends Provider { static String NAME = "Sample"; - static double VERSION = 1.1d; + static String VERSION = "1.1"; static String INFO = "Good for nothing"; SampleProvider() { super(NAME, VERSION, INFO); diff --git a/jdk/test/java/security/Provider/RemoveProvider.java b/jdk/test/java/security/Provider/RemoveProvider.java index 6b1bb0d323e..05ab5eb0549 100644 --- a/jdk/test/java/security/Provider/RemoveProvider.java +++ b/jdk/test/java/security/Provider/RemoveProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4190873 7054918 + * @bug 4190873 7054918 8130181 * @library ../testlibrary * @summary Make sure provider instance can be removed from list of registered * providers, and "entrySet", "keySet", and "values" methods don't loop @@ -46,11 +46,11 @@ public class RemoveProvider { public static void main0(String[] args) throws Exception { // Add provider 1 - Provider p1 = new MyProvider("name1",1,""); + Provider p1 = new MyProvider("name1","1",""); Security.addProvider(p1); // Add provider 2 - Provider p2 = new MyProvider("name2",1,""); + Provider p2 = new MyProvider("name2","1",""); Security.addProvider(p2); // List all providers @@ -183,7 +183,7 @@ public class RemoveProvider { } class MyProvider extends Provider { - public MyProvider(String name, double version, String info) { + public MyProvider(String name, String version, String info) { super(name, version, info); put("Signature", name+".signature"); put("Digest", name+".digest"); diff --git a/jdk/test/java/security/Provider/SupportsParameter.java b/jdk/test/java/security/Provider/SupportsParameter.java index 263b81ebfd5..bc3cb031791 100644 --- a/jdk/test/java/security/Provider/SupportsParameter.java +++ b/jdk/test/java/security/Provider/SupportsParameter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 4911081 + * @bug 4911081 8130181 * @summary verify that Provider.Service.supportsParameter() works * @author Andreas Sterbenz */ @@ -104,7 +104,7 @@ public class SupportsParameter { private static class MyProvider extends Provider { MyProvider() { - super("MyProvider", 1.0d, "MyProvider"); + super("MyProvider", "1.0", "MyProvider"); put("Signature.DSA0", "foo.DSA0"); diff --git a/jdk/test/java/security/Provider/TestSecurityProvider.java b/jdk/test/java/security/Provider/TestSecurityProvider.java index df6b82b7562..32206a313f2 100644 --- a/jdk/test/java/security/Provider/TestSecurityProvider.java +++ b/jdk/test/java/security/Provider/TestSecurityProvider.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 @@ -30,7 +30,7 @@ import java.security.Provider; public final class TestSecurityProvider extends Provider { public TestSecurityProvider() { - super("TEST", 1.0d, "Test Security provider"); + super("TEST", "1.0", "Test Security provider"); System.out.println(String.format("TEST Security provider loaded" + " successfully : %s", this.toString())); } @@ -38,7 +38,7 @@ public final class TestSecurityProvider extends Provider { @Override public String toString() { return "TestSecurityProvider [getName()=" + getName() - + ", getVersion()=" + getVersion() + ", getInfo()=" + + ", getVersion()=" + getVersionStr() + ", getInfo()=" + getInfo() + ", toString()=" + super.toString() + "]"; } diff --git a/jdk/test/java/security/Provider/Turkish.java b/jdk/test/java/security/Provider/Turkish.java index 21ac4136b56..af31507664f 100644 --- a/jdk/test/java/security/Provider/Turkish.java +++ b/jdk/test/java/security/Provider/Turkish.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 6220064 7054918 + * @bug 6220064 7054918 8130181 * @summary make sure everything works ok in the Turkish local (dotted/dotless i problem) * @author Andreas Sterbenz */ @@ -107,7 +107,7 @@ public class Turkish { private static class TProvider extends Provider { TProvider(String name) { - super(name, 1.0d, null); + super(name, "1.0", null); put("Signature.MD5withRSA", "com.foo.Sig"); put("Alg.Alias.Signature.MD5RSA", "MD5withRSA"); put("sIGNATURE.shaWITHrsa", "com.foo.Sig"); diff --git a/jdk/test/java/security/SecureClassLoader/DefineClass.java b/jdk/test/java/security/SecureClassLoader/DefineClass.java index 33efdb0e648..7e7bc77c617 100644 --- a/jdk/test/java/security/SecureClassLoader/DefineClass.java +++ b/jdk/test/java/security/SecureClassLoader/DefineClass.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 @@ -54,7 +54,7 @@ import java.util.PropertyPermission; /* * @test - * @bug 6826789 8131486 + * @bug 6826789 8131486 8130181 * @summary Make sure equivalent ProtectionDomains are granted the same * permissions when the CodeSource URLs are different but resolve * to the same ip address after name service resolution. @@ -194,7 +194,7 @@ public class DefineClass { private static class TestProvider extends Provider { TestProvider() { - super("Test8131486", 0.0, "For testing only"); + super("Test8131486", "0.0", "For testing only"); putService(new Provider.Service(this, "KeyStore", "Test8131486", "DefineClass$TestKeyStore", null, null)); } diff --git a/jdk/test/java/security/Security/AddProvider.java b/jdk/test/java/security/Security/AddProvider.java index 27559ffdbc8..e265716c8f6 100644 --- a/jdk/test/java/security/Security/AddProvider.java +++ b/jdk/test/java/security/Security/AddProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8001319 + * @bug 8001319 8130181 * @summary check that SecurityPermission insertProvider permission is enforced * correctly * @run main/othervm/policy=AddProvider.policy.1 AddProvider 1 @@ -53,7 +53,7 @@ public class AddProvider { private static class TestProvider extends Provider { TestProvider(String name) { - super(name, 0.0, "Not for use in production systems!"); + super(name, "0.0", "Not for use in production systems!"); } } } diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java b/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java index 34ecd20e49e..0e8b728f152 100644 --- a/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/provider/HashProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 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 @@ -27,7 +27,7 @@ import java.security.*; public final class HashProvider extends Provider { public HashProvider() { - super("HashProvider", 1.0d, ""); + super("HashProvider", "1.0", ""); // register all algorithms from the following providers into this provider // the security framework will try to load them via the classloader of this provider addAlgorithms("SunRsaSign"); diff --git a/jdk/test/java/security/Security/SynchronizedAccess.java b/jdk/test/java/security/Security/SynchronizedAccess.java index e1ccef62598..4e244a291e3 100644 --- a/jdk/test/java/security/Security/SynchronizedAccess.java +++ b/jdk/test/java/security/Security/SynchronizedAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4162583 7054918 + * @bug 4162583 7054918 8130181 * @library ../testlibrary * @summary Make sure Provider api implementations are synchronized properly */ @@ -61,7 +61,7 @@ class AccessorThread extends Thread { public void run() { Provider[] provs = new Provider[10]; for (int i=0; i < provs.length; i++) - provs[i] = new MyProvider("name"+i, 1, "test"); + provs[i] = new MyProvider("name"+i, "1", "test"); int rounds = 20; while (rounds-- > 0) { @@ -86,7 +86,7 @@ class AccessorThread extends Thread { } class MyProvider extends Provider { - public MyProvider(String name, double version, String info) { + public MyProvider(String name, String version, String info) { super(name, version, info); put("Signature.sigalg", "sigimpl"); } diff --git a/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java b/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java index 9854df76180..f06317c9668 100644 --- a/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java +++ b/jdk/test/java/security/Security/removing/RemoveProviderByIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4208414 + * @bug 4208414 8130181 * @summary Providers should be removed "by-identity" - not "by-value" */ @@ -34,7 +34,7 @@ public class RemoveProviderByIdentity { public static void main(String[] args) throws Exception { String PROVIDER_NAME = "myprovider"; - Security.addProvider(new MyProvider(PROVIDER_NAME, 1, "test")); + Security.addProvider(new MyProvider(PROVIDER_NAME, "1", "test")); if (Security.getProvider(PROVIDER_NAME) == null) throw new Exception("provider not registered"); @@ -45,7 +45,7 @@ public class RemoveProviderByIdentity { } class MyProvider extends Provider { - public MyProvider(String name, double version, String info) { + public MyProvider(String name, String version, String info) { super(name, version, info); put("Signature.sigalg", "sigimpl"); } diff --git a/jdk/test/java/security/Signature/SignatureGetAlgorithm.java b/jdk/test/java/security/Signature/SignatureGetAlgorithm.java index 6732d66d44c..a85a30bf561 100644 --- a/jdk/test/java/security/Signature/SignatureGetAlgorithm.java +++ b/jdk/test/java/security/Signature/SignatureGetAlgorithm.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 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 @@ -27,7 +27,7 @@ /* * @test - * @bug 8014620 + * @bug 8014620 8130181 * @summary Signature.getAlgorithm return null in special case * @run main/othervm SignatureGetAlgorithm * @author youdwei @@ -49,7 +49,7 @@ public class SignatureGetAlgorithm { public static class TestProvider extends Provider { TestProvider() { - super("testSignatureGetAlgorithm", 1.0, "test Signatures"); + super("testSignatureGetAlgorithm", "1.0", "test Signatures"); put("Signature.MySignatureAlg", "SignatureGetAlgorithm$MySignatureAlg"); } diff --git a/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java b/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java index c270e97c4ce..60c210343d4 100644 --- a/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java +++ b/jdk/test/java/security/cert/CertPathBuilder/StubProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 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 @@ -23,14 +23,14 @@ /* * - * @bug 4408997 + * @bug 4408997 8130181 * Used by GetInstance test. */ import java.security.Provider; public class StubProvider extends Provider { public StubProvider() { - super( "StubProvider", 1.1, "No Info"); + super( "StubProvider", "1.1", "No Info"); put("CertPathBuilder.PKIX", "StubProviderImpl"); } } diff --git a/jdk/test/javax/crypto/JceSecurity/MyProvider.java b/jdk/test/javax/crypto/JceSecurity/MyProvider.java index 5e3f92d2a65..9216bb8a07c 100644 --- a/jdk/test/javax/crypto/JceSecurity/MyProvider.java +++ b/jdk/test/javax/crypto/JceSecurity/MyProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -23,7 +23,7 @@ /* * test - * @bug 6377058 + * @bug 6377058 8130181 * @summary SunJCE depends on sun.security.provider.SignatureImpl * behaviour, BC can't load into 1st slot. * @author Brad R. Wetmore @@ -34,7 +34,7 @@ import java.security.*; public class MyProvider extends Provider { public MyProvider() { - super("MyProvider", 1.0, "CertImpl"); + super("MyProvider", "1.0", "CertImpl"); put("CertificateFactory.X.509", "MyCertificateFactory"); } } diff --git a/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java b/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java index bfa34743224..f060a6c0ecf 100644 --- a/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java +++ b/jdk/test/javax/crypto/SecretKeyFactory/Provider1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -23,7 +23,7 @@ /* * test - * @bug 6370923 + * @bug 6370923 8130181 * @summary SecretKeyFactory failover does not work * @author Brad R. Wetmore */ @@ -35,7 +35,7 @@ import java.security.*; public class Provider1 extends Provider { public Provider1() { - super("Provider1", 1.0, "SecretKeyFactory"); + super("Provider1", "1.0", "SecretKeyFactory"); System.out.println("Creating Provider1"); put("SecretKeyFactory.DUMMY", "com.p1.P1SecretKeyFactory"); } diff --git a/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java b/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java index 294264c712f..ed8246d17c7 100644 --- a/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java +++ b/jdk/test/javax/crypto/SecretKeyFactory/Provider2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -23,7 +23,7 @@ /* * test - * @bug 6370923 + * @bug 6370923 8130181 * @summary SecretKeyFactory failover does not work * @author Brad R. Wetmore */ @@ -35,7 +35,7 @@ import java.security.*; public class Provider2 extends Provider { public Provider2() { - super("Provider2", 1.0, "SecretKeyFactory"); + super("Provider2", "1.0", "SecretKeyFactory"); System.out.println("Creating Provider2"); put("SecretKeyFactory.DUMMY", "com.p2.P2SecretKeyFactory"); } diff --git a/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java b/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java index b9c949eaa7d..dcf0fab42c9 100644 --- a/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java +++ b/jdk/test/javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4635454 6208022 + * @bug 4635454 6208022 8130181 * @summary Check pluggability of SSLContext class. */ import java.security.*; @@ -34,7 +34,7 @@ public class CheckSSLContextExport extends Provider { private static String info = "test provider for JSSE pluggability"; public CheckSSLContextExport(String protocols[]) { - super("TestJSSEPluggability", 1.0, info); + super("TestJSSEPluggability", "1.0", info); for (int i=0; i Date: Fri, 19 Aug 2016 16:29:41 +0900 Subject: [PATCH 098/115] 8164326: jrtfsviewer.js and jrtls.js does not work Reviewed-by: sherman, sundar --- .../java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js | 3 ++- jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js index c86514a7166..0d7377a45d2 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtfsviewer.js @@ -53,6 +53,7 @@ var FileSystems = Java.type("java.nio.file.FileSystems"); var Files = Java.type("java.nio.file.Files"); var System = Java.type("java.lang.System"); var URI = Java.type("java.net.URI"); +var Collections = Java.type("java.util.Collections"); // JavaFX classes used var StackPane = Java.type("javafx.scene.layout.StackPane"); @@ -100,7 +101,7 @@ function getJrtFileSystem() { print("did you miss specifying jrt-fs.jar with -cp option?"); usage(); } - return FileSystems.newFileSystem(uri, null, cls.classLoader); + return FileSystems.newFileSystem(uri, Collections.emptyMap(), cls.classLoader); } } diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js index ed96f89b30b..d5e92f29741 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/jrtls.js @@ -34,7 +34,6 @@ * but also compiled and delivered as part of the jrtfs.jar to support access * to the jimage file provided by the shipped JDK by tools running on JDK 8. */ - */ // classes used var Files = Java.type("java.nio.file.Files"); From 22e95f995a6189eefae99123c4d49801b4b4b47a Mon Sep 17 00:00:00 2001 From: Michael Haupt Date: Fri, 19 Aug 2016 10:03:43 +0200 Subject: [PATCH 099/115] 8164102: MethodHandles.countedLoop/4 works incorrect for start/end = Integer.MAX_VALUE Reviewed-by: redestad --- .../java/lang/invoke/MethodHandleImpl.java | 2 +- .../java/lang/invoke/MethodHandles.java | 11 +-- .../CountedLoopIterationCountsTest.java | 90 +++++++++++++++++++ 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 jdk/test/java/lang/invoke/CountedLoopIterationCountsTest.java diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index a0561589beb..d17f0c53f83 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -1934,7 +1934,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; * @return whether the counter has reached the limit. */ static boolean countedLoopPredicate(int counter, int limit) { - return counter <= limit; + return counter < limit; } /** diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 81dedf3090d..a02e2f18b23 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -4583,7 +4583,8 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); * // assume MH_decrement is a handle to x-1 of type int * MethodHandle[] * indexVar = {start, MH_increment}, // i = start; i = i+1 - * loopLimit = {end, null, MH_lessThan, returnVar }, // i Date: Fri, 19 Aug 2016 13:50:03 +0200 Subject: [PATCH 100/115] 8164451: Generate all zero and identity forms at link time Reviewed-by: shade, mhaupt, vlivanov --- .../lang/invoke/GenerateJLIClassesHelper.java | 28 +++++++++++++++++++ .../lang/invoke/InvokerBytecodeGenerator.java | 5 ++++ .../classes/java/lang/invoke/LambdaForm.java | 17 +++++++++-- .../java/lang/invoke/MethodHandleImpl.java | 6 ++++ .../internal/misc/JavaLangInvokeAccess.java | 6 ++++ .../plugins/GenerateJLIClassesPlugin.java | 15 ++++++++-- 6 files changed, 71 insertions(+), 6 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java index 1f1b50d67c5..90ee2c7e13a 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -38,6 +38,34 @@ import java.util.HashSet; */ class GenerateJLIClassesHelper { + static byte[] generateBasicFormsClassBytes(String className) { + ArrayList forms = new ArrayList<>(); + ArrayList names = new ArrayList<>(); + HashSet dedupSet = new HashSet<>(); + for (LambdaForm.BasicType type : LambdaForm.BasicType.values()) { + LambdaForm zero = LambdaForm.zeroForm(type); + String name = zero.kind.defaultLambdaName + + "_" + zero.returnType().basicTypeChar(); + // since zero is the same as identity for Void, we deduplicate + // aggressively to guard against this specifically and not get + // caught on future equivalences + if (dedupSet.add(name)) { + names.add(name); + forms.add(zero); + } + LambdaForm identity = LambdaForm.identityForm(type); + name = identity.kind.defaultLambdaName + + "_" + identity.returnType().basicTypeChar(); + if (dedupSet.add(name)) { + names.add(name); + forms.add(identity); + } + } + return generateCodeBytesForLFs(className, + names.toArray(new String[0]), + forms.toArray(new LambdaForm[0])); + } + static byte[] generateDirectMethodHandleHolderClassBytes(String className, MethodType[] methodTypes, int[] types) { LambdaForm[] forms = new LambdaForm[methodTypes.length]; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index ebfe415fbf1..6b9a2703be2 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -624,6 +624,11 @@ class InvokerBytecodeGenerator { return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); } case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); + case ZERO: // fall-through + case IDENTITY: { + name = name + "_" + form.returnType().basicTypeChar(); + return resolveFrom(name, invokerType, LambdaForm.Holder.class); + } case DIRECT_INVOKE_INTERFACE: // fall-through case DIRECT_INVOKE_SPECIAL: // fall-through case DIRECT_INVOKE_STATIC: // fall-through diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index c70d6c4163a..e4417baad71 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -270,6 +270,8 @@ class LambdaForm { enum Kind { GENERIC(""), + ZERO("zero"), + IDENTITY("identity"), BOUND_REINVOKER("BMH.reinvoke"), REINVOKER("MH.reinvoke"), DELEGATE("MH.delegate"), @@ -1848,7 +1850,7 @@ class LambdaForm { // bootstrap dependency on this method in case we're interpreting LFs if (isVoid) { Name[] idNames = new Name[] { argument(0, L_TYPE) }; - idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT); + idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT, Kind.IDENTITY); idForm.compileToBytecode(); idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm)); @@ -1856,13 +1858,13 @@ class LambdaForm { zeFun = idFun; } else { Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) }; - idForm = new LambdaForm(idMem.getName(), 2, idNames, 1); + idForm = new LambdaForm(idMem.getName(), 2, idNames, 1, Kind.IDENTITY); idForm.compileToBytecode(); idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm)); Object zeValue = Wrapper.forBasicType(btChar).zero(); Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) }; - zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1); + zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1, Kind.ZERO); zeForm.compileToBytecode(); zeFun = new NamedFunction(zeMem, SimpleMethodHandle.make(zeMem.getInvocationType(), zeForm)); } @@ -1921,8 +1923,17 @@ class LambdaForm { if (USE_PREDEFINED_INTERPRET_METHODS) computeInitialPreparedForms(); NamedFunction.initializeInvokers(); + + // The Holder class will contain pre-generated forms resolved + // using MemberName.getFactory(). However, that doesn't initialize the + // class, which subtly breaks inlining etc. By forcing + // initialization of the Holder class we avoid these issues. + UNSAFE.ensureClassInitialized(Holder.class); } + /* Placeholder class for zero and identity forms generated ahead of time */ + final class Holder {} + // The following hack is necessary in order to suppress TRACE_INTERPRETER // during execution of the static initializes of this class. // Turning on TRACE_INTERPRETER too early will cause diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index d17f0c53f83..4d0c2890fdf 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -1739,6 +1739,12 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; return GenerateJLIClassesHelper .generateConcreteBMHClassBytes(types); } + + @Override + public byte[] generateBasicFormsClassBytes(final String className) { + return GenerateJLIClassesHelper + .generateBasicFormsClassBytes(className); + } }); } diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java index ea941316b4e..867853f22e8 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java @@ -72,4 +72,10 @@ public interface JavaLangInvokeAccess { */ Map.Entry generateConcreteBMHClassBytes( final String types); + + /** + * Returns a {@code byte[]} containing the bytecode for a class implementing + * the zero and identity forms of all {@code LambdaForm.BasicType}s. + */ + byte[] generateBasicFormsClassBytes(final String className); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java index 3866c95c2dc..d59bc8a2341 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java @@ -65,6 +65,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DELEGATING_METHOD_HANDLE = "java/lang/invoke/DelegatingMethodHandle$Holder"; + private static final String BASIC_FORMS_HANDLE = "java/lang/invoke/LambdaForm$Holder"; + private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); @@ -227,14 +229,15 @@ public final class GenerateJLIClassesPlugin implements Plugin { in.transformAndCopy(entry -> { // filter out placeholder entries if (entry.path().equals(DIRECT_METHOD_HANDLE_ENTRY) || - entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY)) { + entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY) || + entry.path().equals(BASIC_FORMS_HANDLE_ENTRY)) { return null; } else { return entry; } }, out); speciesTypes.forEach(types -> generateBMHClass(types, out)); - generateDMHClass(out); + generateHolderClasses(out); return out.build(); } @@ -257,7 +260,7 @@ public final class GenerateJLIClassesPlugin implements Plugin { } } - private void generateDMHClass(ResourcePoolBuilder out) { + private void generateHolderClasses(ResourcePoolBuilder out) { int count = 0; for (List entry : dmhMethods.values()) { count += entry.size(); @@ -284,6 +287,10 @@ public final class GenerateJLIClassesPlugin implements Plugin { DELEGATING_METHOD_HANDLE, methodTypes); ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HANDLE_ENTRY, bytes); out.add(ndata); + + bytes = JLIA.generateBasicFormsClassBytes(BASIC_FORMS_HANDLE); + ndata = ResourcePoolEntry.create(BASIC_FORMS_HANDLE_ENTRY, bytes); + out.add(ndata); } catch (Exception ex) { throw new PluginException(ex); } @@ -292,6 +299,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { "/java.base/" + DIRECT_METHOD_HANDLE + ".class"; private static final String DELEGATING_METHOD_HANDLE_ENTRY = "/java.base/" + DELEGATING_METHOD_HANDLE + ".class"; + private static final String BASIC_FORMS_HANDLE_ENTRY = + "/java.base/" + BASIC_FORMS_HANDLE + ".class"; // Convert LL -> LL, L3 -> LLL private static String expandSignature(String signature) { From e49b61eacb55ee672d829132a9c65f9bde37bbec Mon Sep 17 00:00:00 2001 From: Tim Bell Date: Fri, 19 Aug 2016 07:54:03 -0700 Subject: [PATCH 101/115] 8164402: key word 'requires' appearing in comment causing a build failure Reviewed-by: erikj, dholmes --- make/common/Modules.gmk | 1 + 1 file changed, 1 insertion(+) diff --git a/make/common/Modules.gmk b/make/common/Modules.gmk index ef77ffd5213..9f1482e0c64 100644 --- a/make/common/Modules.gmk +++ b/make/common/Modules.gmk @@ -229,6 +229,7 @@ $(MODULE_DEPS_MAKEFILE): $(MODULE_INFOS) \ sub(/public/, ""); \ sub(/\/\/.*/, ""); \ sub(/\/\*.*\*\//, ""); \ + gsub(/^ +\*.*/, ""); \ gsub(/ /, ""); \ printf(" %s", $$0) } \ END { printf("\n") }' $m \ From 2f2de77c1dfd85b365ee8be36a116a4fb67e0dad Mon Sep 17 00:00:00 2001 From: Chris Hegarty Date: Fri, 19 Aug 2016 18:06:46 +0100 Subject: [PATCH 102/115] 8156841: sun.security.pkcs11.SunPKCS11 poller thread retains a strong reference to the context class loader Reviewed-by: dfuchs, jnimeh, valeriep --- .../share/classes/sun/security/pkcs11/SunPKCS11.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java index 2946bdbdb52..98b5e21ea2c 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java @@ -818,6 +818,7 @@ public final class SunPKCS11 extends AuthProvider { } final TokenPoller poller = new TokenPoller(this); Thread t = new Thread(null, poller, "Poller " + getName(), 0, false); + t.setContextClassLoader(null); t.setDaemon(true); t.setPriority(Thread.MIN_PRIORITY); t.start(); From f86257fff949c7552a3432fbcd2204334d466c2a Mon Sep 17 00:00:00 2001 From: Artem Smotrakov Date: Fri, 19 Aug 2016 10:57:44 -0700 Subject: [PATCH 103/115] 8164100: com/sun/crypto/provider/KeyFactory/TestProviderLeak.java fails with java.util.concurrent.TimeoutException Reviewed-by: valeriep --- .../provider/KeyFactory/TestProviderLeak.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java b/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java index d7b3971676c..650e743baa9 100644 --- a/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java +++ b/jdk/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -53,7 +53,20 @@ public class TestProviderLeak { // or throws out TimeoutException. private static final int RESERVATION = 3; // The maximum time, 5 seconds, to wait for each iteration. - private static final int TIME_OUT = 5; + private static final int TIME_OUT; + static { + int timeout = 5; + try { + double timeoutFactor = Double.parseDouble( + System.getProperty("test.timeout.factor", "1.0")); + timeout = (int) (timeout * timeoutFactor); + } catch (Exception e) { + System.out.println("Warning: " + e); + } + TIME_OUT = timeout; + System.out.println("Timeout for each iteration is " + + TIME_OUT + " seconds"); + } private static Deque eatupMemory() throws Exception { dumpMemoryStats("Before memory allocation"); From 069573f635e33b86d2135d53478eafec3ff65d56 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Fri, 19 Aug 2016 17:46:44 +0200 Subject: [PATCH 104/115] 8164485: Zero forms not properly generated Reviewed-by: psandoz --- .../java/lang/invoke/GenerateJLIClassesHelper.java | 12 +----------- .../java/lang/invoke/InvokerBytecodeGenerator.java | 1 - 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java index 90ee2c7e13a..38432e15258 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -43,18 +43,8 @@ class GenerateJLIClassesHelper { ArrayList names = new ArrayList<>(); HashSet dedupSet = new HashSet<>(); for (LambdaForm.BasicType type : LambdaForm.BasicType.values()) { - LambdaForm zero = LambdaForm.zeroForm(type); - String name = zero.kind.defaultLambdaName - + "_" + zero.returnType().basicTypeChar(); - // since zero is the same as identity for Void, we deduplicate - // aggressively to guard against this specifically and not get - // caught on future equivalences - if (dedupSet.add(name)) { - names.add(name); - forms.add(zero); - } LambdaForm identity = LambdaForm.identityForm(type); - name = identity.kind.defaultLambdaName + String name = identity.kind.defaultLambdaName + "_" + identity.returnType().basicTypeChar(); if (dedupSet.add(name)) { names.add(name); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 6b9a2703be2..c2efac045f1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -624,7 +624,6 @@ class InvokerBytecodeGenerator { return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); } case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); - case ZERO: // fall-through case IDENTITY: { name = name + "_" + form.returnType().basicTypeChar(); return resolveFrom(name, invokerType, LambdaForm.Holder.class); From 13f73f71eb90f15449b2eb4baec4d13b33c15c70 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 19 Aug 2016 13:38:12 -0700 Subject: [PATCH 105/115] 8164432: java/nio/file/Files/probeContentType/Basic.java fails on windows for Content type: audio/vnd.dlna.adts Add audio/vnd.dlna.adts as an allowed MIME type for the aac extension. Reviewed-by: darcy --- jdk/test/java/nio/file/Files/probeContentType/Basic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/java/nio/file/Files/probeContentType/Basic.java b/jdk/test/java/nio/file/Files/probeContentType/Basic.java index 5e0d0c94c62..003f9494f11 100644 --- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java +++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java @@ -184,7 +184,7 @@ public class Basic { "webm" }; String[][] expectedTypes = new String[][] { - {"audio/aac", "audio/x-aac"}, + {"audio/aac", "audio/x-aac", "audio/vnd.dlna.adts"}, {"audio/flac", "audio/x-flac"}, {"image/jpeg"}, {"audio/mpeg"}, From 17e5e3f34be1e18a9d378ff5a07878102a8aec31 Mon Sep 17 00:00:00 2001 From: Vinnie Ryan Date: Fri, 19 Aug 2016 22:15:32 +0100 Subject: [PATCH 106/115] 8164494: SunPKCS11 requires a non-empty PBE password Reviewed-by: valeriep --- .../share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index 87c3da39c8c..9d82ebb6ff2 100644 --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -108,6 +108,11 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { } try { this.prf = Mac.getInstance(prfAlgo); + // SunPKCS11 requires a non-empty PBE password + if (passwdBytes.length == 0 && + this.prf.getProvider().getName().startsWith("SunPKCS11")) { + this.prf = Mac.getInstance(prfAlgo, SunJCE.getInstance()); + } } catch (NoSuchAlgorithmException nsae) { // not gonna happen; re-throw just in case InvalidKeySpecException ike = new InvalidKeySpecException(); From 55b1ffa690c8cafe8d8974c5fee5e98efa2918c8 Mon Sep 17 00:00:00 2001 From: Valerie Peng Date: Fri, 19 Aug 2016 23:24:23 +0000 Subject: [PATCH 107/115] 8078661: [SunPKCS11] Fails to cast into RSAPrivateCrtKey after RSA KeyPair Generation Changed to check all components instead of only the public exponent for RSA CRT key determination Reviewed-by: vinnie --- .../classes/sun/security/pkcs11/P11Key.java | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java index 2ecfd85186c..7800737fabe 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java @@ -340,25 +340,33 @@ abstract class P11Key implements Key, Length { } else { switch (algorithm) { case "RSA": - // XXX better test for RSA CRT keys (single getAttributes() call) - // we need to determine whether this is a CRT key - // see if we can obtain the public exponent - // this should also be readable for sensitive/extractable keys + // In order to decide if this is RSA CRT key, we first query + // and see if all extra CRT attributes are available. CK_ATTRIBUTE[] attrs2 = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_PUBLIC_EXPONENT), + new CK_ATTRIBUTE(CKA_PRIME_1), + new CK_ATTRIBUTE(CKA_PRIME_2), + new CK_ATTRIBUTE(CKA_EXPONENT_1), + new CK_ATTRIBUTE(CKA_EXPONENT_2), + new CK_ATTRIBUTE(CKA_COEFFICIENT), }; boolean crtKey; try { session.token.p11.C_GetAttributeValue (session.id(), keyID, attrs2); - crtKey = (attrs2[0].pValue instanceof byte[]); + crtKey = ((attrs2[0].pValue instanceof byte[]) && + (attrs2[1].pValue instanceof byte[]) && + (attrs2[2].pValue instanceof byte[]) && + (attrs2[3].pValue instanceof byte[]) && + (attrs2[4].pValue instanceof byte[]) && + (attrs2[5].pValue instanceof byte[])) ; } catch (PKCS11Exception e) { // ignore, assume not available crtKey = false; } if (crtKey) { return new P11RSAPrivateKey - (session, keyID, algorithm, keyLength, attributes); + (session, keyID, algorithm, keyLength, attributes, attrs2); } else { return new P11RSAPrivateNonCRTKey (session, keyID, algorithm, keyLength, attributes); @@ -475,8 +483,24 @@ abstract class P11Key implements Key, Length { private BigInteger n, e, d, p, q, pe, qe, coeff; private byte[] encoded; P11RSAPrivateKey(Session session, long keyID, String algorithm, - int keyLength, CK_ATTRIBUTE[] attributes) { - super(PRIVATE, session, keyID, algorithm, keyLength, attributes); + int keyLength, CK_ATTRIBUTE[] attrs, CK_ATTRIBUTE[] crtAttrs) { + super(PRIVATE, session, keyID, algorithm, keyLength, attrs); + + for (CK_ATTRIBUTE a : crtAttrs) { + if (a.type == CKA_PUBLIC_EXPONENT) { + e = a.getBigInteger(); + } else if (a.type == CKA_PRIME_1) { + p = a.getBigInteger(); + } else if (a.type == CKA_PRIME_2) { + q = a.getBigInteger(); + } else if (a.type == CKA_EXPONENT_1) { + pe = a.getBigInteger(); + } else if (a.type == CKA_EXPONENT_2) { + qe = a.getBigInteger(); + } else if (a.type == CKA_COEFFICIENT) { + coeff = a.getBigInteger(); + } + } } private synchronized void fetchValues() { token.ensureValid(); @@ -485,24 +509,13 @@ abstract class P11Key implements Key, Length { } CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { new CK_ATTRIBUTE(CKA_MODULUS), - new CK_ATTRIBUTE(CKA_PUBLIC_EXPONENT), new CK_ATTRIBUTE(CKA_PRIVATE_EXPONENT), - new CK_ATTRIBUTE(CKA_PRIME_1), - new CK_ATTRIBUTE(CKA_PRIME_2), - new CK_ATTRIBUTE(CKA_EXPONENT_1), - new CK_ATTRIBUTE(CKA_EXPONENT_2), - new CK_ATTRIBUTE(CKA_COEFFICIENT), }; fetchAttributes(attributes); n = attributes[0].getBigInteger(); - e = attributes[1].getBigInteger(); - d = attributes[2].getBigInteger(); - p = attributes[3].getBigInteger(); - q = attributes[4].getBigInteger(); - pe = attributes[5].getBigInteger(); - qe = attributes[6].getBigInteger(); - coeff = attributes[7].getBigInteger(); + d = attributes[1].getBigInteger(); } + public String getFormat() { token.ensureValid(); return "PKCS#8"; @@ -529,7 +542,6 @@ abstract class P11Key implements Key, Length { return n; } public BigInteger getPublicExponent() { - fetchValues(); return e; } public BigInteger getPrivateExponent() { @@ -537,23 +549,18 @@ abstract class P11Key implements Key, Length { return d; } public BigInteger getPrimeP() { - fetchValues(); return p; } public BigInteger getPrimeQ() { - fetchValues(); return q; } public BigInteger getPrimeExponentP() { - fetchValues(); return pe; } public BigInteger getPrimeExponentQ() { - fetchValues(); return qe; } public BigInteger getCrtCoefficient() { - fetchValues(); return coeff; } } From f4ec2171f28f4532ecba993d45b736d0b996da95 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Sat, 20 Aug 2016 17:10:17 +0800 Subject: [PATCH 108/115] 8164437: Test for JDK-8042900 GSSContext is of a different type when jdk.security.jgss is not loaded Reviewed-by: xuelei --- jdk/test/sun/security/krb5/auto/Basic.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/jdk/test/sun/security/krb5/auto/Basic.java b/jdk/test/sun/security/krb5/auto/Basic.java index ef7f11db509..e61928b4bf8 100644 --- a/jdk/test/sun/security/krb5/auto/Basic.java +++ b/jdk/test/sun/security/krb5/auto/Basic.java @@ -23,10 +23,13 @@ /* * @test - * @bug 7152176 + * @bug 7152176 8164437 * @summary More krb5 tests * @compile -XDignore.symbol.file Basic.java - * @run main/othervm Basic + * @run main/othervm + * Basic jdk.security.jgss + * @run main/othervm --limit-modules java.security.jgss,jdk.security.auth + * Basic java.security.jgss */ import sun.security.jgss.GSSUtil; @@ -60,5 +63,12 @@ public class Basic { b.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); Context.handshake(s2, b); + + // Bonus test for 8164437. + String moduleName = c.x().getClass().getModule().getName(); + if (!moduleName.equals(args[0])) { + throw new Exception("Expected: " + args[0] + + ". Actual: " + moduleName); + } } } From 86bb2f51cd6a1bdfc7940e78347742b42237858a Mon Sep 17 00:00:00 2001 From: Yuka Kamiya Date: Mon, 22 Aug 2016 14:24:46 +0900 Subject: [PATCH 109/115] 7094818: closed/java/text/Format/DateFormat tests failed on Hindi 8132861: java/text/Format/DateFormat/Bug4845901.java failed in Thai locale 8134733: java/util/Calendar/CalendarRegression.java failed in ar locale Reviewed-by: okutsu --- .../text/Format/DateFormat/Bug4322313.java | 33 +++++---- .../text/Format/DateFormat/Bug4407042.java | 6 +- .../text/Format/DateFormat/Bug4845901.java | 8 ++ .../text/Format/DateFormat/Bug6530336.java | 10 +-- .../DateFormat/DateFormatRegression.java | 24 +----- .../text/Format/DateFormat/bug4358730.java | 8 +- .../MessageFormat/MessageRegression.java | 12 +-- .../Format/NumberFormat/NumberRegression.java | 11 ++- jdk/test/java/text/testlib/TestUtils.java | 74 +++++++++++++++++++ .../java/util/Calendar/CalendarLimitTest.java | 8 +- .../util/Calendar/CalendarRegression.java | 41 ++++++++-- jdk/test/java/util/Calendar/CalendarTest.java | 15 ++-- jdk/test/java/util/Calendar/bug4409072.java | 5 +- jdk/test/java/util/Locale/LocaleCategory.java | 7 +- jdk/test/java/util/Locale/LocaleCategory.sh | 9 ++- jdk/test/java/util/TimeZone/Bug4322313.java | 36 ++++----- .../util/TimeZone/TimeZoneRegression.java | 24 +++--- 17 files changed, 224 insertions(+), 107 deletions(-) create mode 100644 jdk/test/java/text/testlib/TestUtils.java diff --git a/jdk/test/java/text/Format/DateFormat/Bug4322313.java b/jdk/test/java/text/Format/DateFormat/Bug4322313.java index 19987022664..bea772e63e6 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug4322313.java +++ b/jdk/test/java/text/Format/DateFormat/Bug4322313.java @@ -158,7 +158,8 @@ public class Bug4322313 extends IntlTest { try { for (int i=0; i < locs.length; i++) { - Locale.setDefault(locs[i]); + Locale locale = locs[i]; + Locale.setDefault(locale); for (int j=0; j < formats.length; j++) { TimeZone.setDefault(TimeZone.getTimeZone("GMT")); @@ -174,7 +175,7 @@ public class Bug4322313 extends IntlTest { catch (Exception e) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] Unexpected Exception occurred: " + e); continue; @@ -184,7 +185,7 @@ public class Bug4322313 extends IntlTest { if (offset != ((Integer)valids[k][4]).intValue()) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] invalid index: expected:" + valids[k][4] + ", got:" + offset); @@ -193,14 +194,14 @@ public class Bug4322313 extends IntlTest { if (date.getTime() != ((Long)valids[k][1]).longValue()) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] expected:" + valids[k][1] + ", got:" + date.getTime() + ", " + date); } else { /* logln("\tParse Okay [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale) + ", " + formats[j] + "/\"" + valids[k][0] + "\"] expected:" + valids[k][1] + ", got:" + date.getTime() + ", " + date); @@ -212,7 +213,7 @@ public class Bug4322313 extends IntlTest { catch (Exception e) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] Unexpected Exception occurred: " + e); continue; @@ -245,14 +246,14 @@ public class Bug4322313 extends IntlTest { expected.equals("GMT+00:00"))) { err = true; System.err.println("\tFormat Error [Locale=" + - Locale.getDefault() + ", " + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] expected:" + valids[k][2+j] + ", got:" + s + ", " + date); } else { /* logln("\tFormat Okay [Locale=" + - Locale.getDefault() + ", " + + locale + ", " + formats[j] + "/\"" + valids[k][0] + "\"] expected:" + valids[k][2+j] + ", got:" + s + ", " + date); @@ -271,7 +272,7 @@ public class Bug4322313 extends IntlTest { if (date != null) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] expected:null , got:" + date); } @@ -279,14 +280,14 @@ public class Bug4322313 extends IntlTest { if (offset != ((Integer)invalids[k][1]).intValue()) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] incorrect offset. expected:" + invalids[k][1] + ", got: " + offset); } else { /* logln("\tParse Okay [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] correct offset: " + offset); */ @@ -295,7 +296,7 @@ public class Bug4322313 extends IntlTest { catch (Exception e) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] Unexpected Exception occurred: " + e); } @@ -315,14 +316,14 @@ public class Bug4322313 extends IntlTest { if (offset != ((Integer)invalids[k][1]).intValue()) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] Expected exception occurred with an incorrect offset. expected:" + invalids[k][1] + ", got: " + offset); } else { /* logln("\tParse Okay [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] Expected exception occurred with an correct offset: " + offset); @@ -332,7 +333,7 @@ public class Bug4322313 extends IntlTest { catch (Exception e) { err = true; System.err.println("\tParse Error [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] Invalid exception occurred: " + e); } @@ -340,7 +341,7 @@ public class Bug4322313 extends IntlTest { if (!correctParseException) { err = true; System.err.println("\tParse Error: [Locale=" + - Locale.getDefault() + ", " + formats[j] + + locale + ", " + formats[j] + "/\"" + invalids[k][0] + "\"] Expected exception didn't occur."); } diff --git a/jdk/test/java/text/Format/DateFormat/Bug4407042.java b/jdk/test/java/text/Format/DateFormat/Bug4407042.java index 8cc557e5a97..1960cb2b151 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug4407042.java +++ b/jdk/test/java/text/Format/DateFormat/Bug4407042.java @@ -26,6 +26,7 @@ * @bug 4407042 * @summary Make sure that cloned SimpleDateFormat objects work * independently in multiple threads. + * @library /java/text/testlib * @run main Bug4407042 10 */ @@ -44,8 +45,9 @@ public class Bug4407042 { void test() { Locale locale = Locale.getDefault(); - if (locale.equals(new Locale("th", "TH")) || - locale.equals(new Locale("hi", "IN"))) { + if (!TestUtils.usesAsciiDigits(locale) + || !TestUtils.usesGregorianCalendar(locale)) { + System.out.println("Skipping this test because locale is " + locale); return; } diff --git a/jdk/test/java/text/Format/DateFormat/Bug4845901.java b/jdk/test/java/text/Format/DateFormat/Bug4845901.java index 8ed8bd47648..a88b47a761e 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug4845901.java +++ b/jdk/test/java/text/Format/DateFormat/Bug4845901.java @@ -27,6 +27,8 @@ * @summary Make sure that SimpleDateFormat.parse() can distinguish * the same time zone abbreviation for standard and daylight saving * time. + * @library /java/text/testlib + * @run main Bug4845901 */ import java.util.*; @@ -34,6 +36,12 @@ import java.text.SimpleDateFormat; public class Bug4845901 { public static void main (String args[]) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + System.out.println("Skipping this test because locale is " + locale); + return; + } + TimeZone savedTZ = TimeZone.getDefault(); TimeZone.setDefault(TimeZone.getTimeZone("Australia/Sydney")); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS z"); diff --git a/jdk/test/java/text/Format/DateFormat/Bug6530336.java b/jdk/test/java/text/Format/DateFormat/Bug6530336.java index d01a96aba9e..ba280084666 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug6530336.java +++ b/jdk/test/java/text/Format/DateFormat/Bug6530336.java @@ -24,6 +24,7 @@ /* * @test * @bug 6530336 6537997 8008577 + * @library /java/text/testlib * @run main/othervm -Djava.locale.providers=COMPAT,SPI Bug6530336 */ @@ -43,7 +44,6 @@ public class Bug6530336 { try { Locale locales[] = Locale.getAvailableLocales(); - Locale locale_Japan = new Locale("ja", "JP", "JP"); TimeZone timezone_LA = TimeZone.getTimeZone("America/Los_Angeles"); TimeZone.setDefault(timezone_LA); @@ -60,12 +60,12 @@ public class Bug6530336 { Date[] dates = new Date[2]; for (int i = 0; i < locales.length; i++) { - if (locales[i].getLanguage().equals("th") || - locales[i].equals(locale_Japan)) { + Locale locale = locales[i]; + if (!TestUtils.usesGregorianCalendar(locale)) { continue; } - Locale.setDefault(locales[i]); + Locale.setDefault(locale); for (int j = 0; j < timezones.length; j++) { Calendar cal = Calendar.getInstance(timezones[j]); @@ -83,7 +83,7 @@ public class Bug6530336 { if (!expected[j].equals(date_LA)) { System.err.println("Got wrong Pacific time (" + - date_LA + ") for (" + date + ") in " + locales[i] + + date_LA + ") for (" + date + ") in " + locale + " in " + timezones[j] + ".\nExpected=" + expected[j]); err = true; diff --git a/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java b/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java index d276aac088b..5c416b0dc53 100644 --- a/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java +++ b/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java @@ -72,7 +72,6 @@ public class DateFormatRegression extends IntlTest { } public void Test4052408() { - DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US); Date date = new Date(97, Calendar.MAY, 3, 8, 55); @@ -164,7 +163,9 @@ public class DateFormatRegression extends IntlTest { } public void Test4059917() { - if (Locale.getDefault().equals(new Locale("hi", "IN"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesAsciiDigits(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -621,25 +622,6 @@ public class DateFormatRegression extends IntlTest { } } - /* - Synopsis: Chinese time zone CTT is not recogonized correctly. - Description: Platform Chinese Windows 95 - ** Time zone set to CST ** - */ - public void Test4108407() { - - long l = System.currentTimeMillis(); - logln("user.timezone = " + System.getProperty("user.timezone", "?")); - logln("Time Zone :" + - DateFormat.getDateInstance().getTimeZone().getID()); - logln("Default format :" + - DateFormat.getDateInstance().format(new Date(l))); - logln("Full format :" + - DateFormat.getDateInstance(DateFormat.FULL).format(new - Date(l))); - logln("*** Set host TZ to CST ***"); - logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***"); - } - /** * SimpleDateFormat won't parse "GMT" */ diff --git a/jdk/test/java/text/Format/DateFormat/bug4358730.java b/jdk/test/java/text/Format/DateFormat/bug4358730.java index dc448ecd767..fa67be47c9c 100644 --- a/jdk/test/java/text/Format/DateFormat/bug4358730.java +++ b/jdk/test/java/text/Format/DateFormat/bug4358730.java @@ -47,23 +47,17 @@ public class bug4358730 extends IntlTest { }; int[] year = {2, 20, 200, 2000}; - SimpleDateFormat sdf = new SimpleDateFormat(); int datasize = data.length; int nPatterns = data[0].length; public void Test4358730() { - Locale locale = Locale.getDefault(); - if (locale.equals(new Locale("th", "TH")) || - locale.equals(new Locale("hi", "IN"))) { - return; - } - TimeZone saveZone = TimeZone.getDefault(); Locale saveLocale = Locale.getDefault(); try { TimeZone.setDefault(TimeZone.getTimeZone("PST")); Locale.setDefault(new Locale("en", "US")); + SimpleDateFormat sdf = new SimpleDateFormat(); for (int i = 0; i < datasize; i++) { Date d = new Date(year[i]-1900, 10, 15); diff --git a/jdk/test/java/text/Format/MessageFormat/MessageRegression.java b/jdk/test/java/text/Format/MessageFormat/MessageRegression.java index e0d8d80e362..329506ffa35 100644 --- a/jdk/test/java/text/Format/MessageFormat/MessageRegression.java +++ b/jdk/test/java/text/Format/MessageFormat/MessageRegression.java @@ -28,6 +28,7 @@ * 4142938 4169959 4232154 4293229 * @summary Regression tests for MessageFormat and associated classes * @library /java/text/testlib + * @run main MessageRegression */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved @@ -121,14 +122,15 @@ public class MessageRegression extends IntlTest { * More robust message formats. */ public void Test4031438() { - String pattern1 = "Impossible {1} has occurred -- status code is {0} and message is {2}."; - String pattern2 = "Double '' Quotes {0} test and quoted '{1}' test plus 'other {2} stuff'."; - - // If the current locale is hi_IN, skip this test case. - if (Locale.getDefault().equals(new Locale("hi", "IN"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesAsciiDigits(locale)) { + logln("Skipping this test because locale is " + locale); return; } + String pattern1 = "Impossible {1} has occurred -- status code is {0} and message is {2}."; + String pattern2 = "Double '' Quotes {0} test and quoted '{1}' test plus 'other {2} stuff'."; + MessageFormat messageFormatter = new MessageFormat(""); try { diff --git a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java index 674fdd619ca..0edaa11ccf5 100644 --- a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java +++ b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java @@ -32,7 +32,7 @@ * 4217661 4243011 4243108 4330377 4233840 4241880 4833877 8008577 * @summary Regression tests for NumberFormat and associated classes * @library /java/text/testlib - * @build IntlTest HexDumpReader + * @build IntlTest HexDumpReader TestUtils * @modules java.base/sun.util.resources * @compile -XDignore.symbol.file NumberRegression.java * @run main/othervm -Djava.locale.providers=COMPAT,SPI NumberRegression @@ -100,6 +100,12 @@ public class NumberRegression extends IntlTest { */ public void Test4088161 (){ + Locale locale = Locale.getDefault(); + if (!TestUtils.usesAsciiDigits(locale)) { + logln("Skipping this test because locale is " + locale); + return; + } + DecimalFormat df = new DecimalFormat(); double d = 100; df.setMinimumFractionDigits(0); @@ -114,8 +120,7 @@ public class NumberRegression extends IntlTest { FieldPosition fp2 = new FieldPosition(0); logln("maxFractionDigits = " + df.getMaximumFractionDigits()); df.format(d, sBuf2, fp2); - String expected = Locale.getDefault().equals(new Locale("hi", "IN")) ? - "\u0967\u0966\u0966" : "100"; + String expected = "100"; if (!sBuf2.toString().equals(expected)) errln(" format(d) = '" + sBuf2 + "'"); } diff --git a/jdk/test/java/text/testlib/TestUtils.java b/jdk/test/java/text/testlib/TestUtils.java new file mode 100644 index 00000000000..309df451697 --- /dev/null +++ b/jdk/test/java/text/testlib/TestUtils.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. + * + * 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.text.DecimalFormatSymbols; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Locale; + +import java.util.Locale.Builder; + +/** + * TestUtils provides utility methods to get a locale-dependent attribute. + * For example, + * - whether or not a non-Gregorian calendar is used + * - whether or not non-ASCII digits are used + * + * This class was developed to help testing for internationalization & + * localization and is not versatile. + */ +public class TestUtils { + + /** + * Returns true if the give locale uses Gregorian calendar. + */ + public static boolean usesGregorianCalendar(Locale locale) { + return Calendar.getInstance(locale).getClass() == GregorianCalendar.class; + } + + /** + * Returns true if the given locale uses ASCII digits. + */ + public static boolean usesAsciiDigits(Locale locale) { + return DecimalFormatSymbols.getInstance(locale).getZeroDigit() == '0'; + } + + /** + * Returns true if the given locale has a special variant which is treated + * as ill-formed in BCP 47. + * + * BCP 47 requires a variant subtag to be 5 to 8 alphanumerics or a + * single numeric followed by 3 alphanumerics. + * However, note that this methods doesn't check a variant so rigorously + * because this is a utility method for testing. Intended special variants + * are: JP, NY, and TH, which can be commonly provided by + * Locale.getAvailableLocales(). + * + */ + public static boolean hasSpecialVariant(Locale locale) { + String variant = locale.getVariant(); + return !variant.isEmpty() + && "JP".equals(variant) || "NY".equals(variant) || "TH".equals(variant); + } + +} diff --git a/jdk/test/java/util/Calendar/CalendarLimitTest.java b/jdk/test/java/util/Calendar/CalendarLimitTest.java index 69dcbb5efcf..ec73cc27bc5 100644 --- a/jdk/test/java/util/Calendar/CalendarLimitTest.java +++ b/jdk/test/java/util/Calendar/CalendarLimitTest.java @@ -24,8 +24,8 @@ /** * @test * @bug 4033662 - * @library /java/text/testlib * @summary test for limit on Calendar + * @library /java/text/testlib * @run main CalendarLimitTest -verbose */ @@ -62,6 +62,12 @@ public class CalendarLimitTest extends IntlTest static long ORIGIN; // This is the *approximate* point at which BC switches to AD public static void main(String argv[]) throws Exception { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + System.out.println("Skipping this test because locale is " + locale); + return; + } + new CalendarLimitTest().run(argv); } diff --git a/jdk/test/java/util/Calendar/CalendarRegression.java b/jdk/test/java/util/Calendar/CalendarRegression.java index baae13f14fd..2852fae33f6 100644 --- a/jdk/test/java/util/Calendar/CalendarRegression.java +++ b/jdk/test/java/util/Calendar/CalendarRegression.java @@ -32,6 +32,7 @@ * 4652815 4652830 4740554 4936355 4738710 4633646 4846659 4822110 4960642 * 4973919 4980088 4965624 5013094 5006864 8152077 * @library /java/text/testlib + * @run main CalendarRegression */ import java.lang.reflect.*; @@ -531,6 +532,12 @@ public class CalendarRegression extends IntlTest { } public void Test4100311() { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); + return; + } + GregorianCalendar cal = (GregorianCalendar)Calendar.getInstance(); cal.set(Calendar.YEAR, 1997); cal.set(Calendar.DAY_OF_YEAR, 1); @@ -541,7 +548,9 @@ public class CalendarRegression extends IntlTest { } public void Test4103271() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -768,6 +777,12 @@ public class CalendarRegression extends IntlTest { } public void Test4114578() { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); + return; + } + int ONE_HOUR = 60*60*1000; TimeZone saveZone = TimeZone.getDefault(); boolean fail = false; @@ -847,6 +862,12 @@ public class CalendarRegression extends IntlTest { * Check isLeapYear for BC years. */ public void Test4125881() { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); + return; + } + GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance(); DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G"); cal.clear(); @@ -865,7 +886,9 @@ public class CalendarRegression extends IntlTest { * at 45 BC, and not have leap years before then). */ public void Test4125892() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -1276,7 +1299,9 @@ public class CalendarRegression extends IntlTest { * This bug relies on the TimeZone bug 4173604 to also be fixed. */ public void Test4173516() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -1755,7 +1780,10 @@ public class CalendarRegression extends IntlTest { * get(int) changes internal states of a Calendar. */ public void Test4685354() { - if (Locale.getDefault().equals(new Locale("hi", "IN"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesAsciiDigits(locale) + || !TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -1860,8 +1888,9 @@ public class CalendarRegression extends IntlTest { * get(int) changes internal states of a Calendar. */ public void Test4655637() { - // Skip this test case if it's Thai locale - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } diff --git a/jdk/test/java/util/Calendar/CalendarTest.java b/jdk/test/java/util/Calendar/CalendarTest.java index d8320295a6d..b04bb03a1fc 100644 --- a/jdk/test/java/util/Calendar/CalendarTest.java +++ b/jdk/test/java/util/Calendar/CalendarTest.java @@ -24,8 +24,9 @@ /** * @test * @bug 4064654 4374886 4984320 4984574 4944795 - * @library /java/text/testlib * @summary test for Calendar + * @library /java/text/testlib + * @run main CalendarTest * @key randomness */ @@ -203,7 +204,9 @@ public class CalendarTest extends IntlTest { } public void TestGenericAPI() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -559,7 +562,9 @@ public class CalendarTest extends IntlTest { // Test the behavior of GMT vs. local time public void TestGMTvsLocal4064654() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } @@ -875,10 +880,6 @@ public class CalendarTest extends IntlTest { // Verify that the fields are as expected (mostly zero) at the epoch start. // Note that we adjust for the default timezone to get most things to zero. public void TestEpochStartFields() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { - return; - } - String[][] lt = { {"en", "US", "US/Pacific"}, /* First day = 1, Minimum day = 1 */ {"en", "US", "America/Anchorage"}, /* First day = 1, Minimum day = 1 */ diff --git a/jdk/test/java/util/Calendar/bug4409072.java b/jdk/test/java/util/Calendar/bug4409072.java index d8e56a45547..af5ef02c349 100644 --- a/jdk/test/java/util/Calendar/bug4409072.java +++ b/jdk/test/java/util/Calendar/bug4409072.java @@ -26,6 +26,7 @@ * @bug 4409072 * @summary tests for set(), add(), and roll() with various week parameters. * @library /java/text/testlib + * @run main bug4409072 */ import java.util.*; @@ -41,7 +42,9 @@ public class bug4409072 extends IntlTest { * (e.g. add(), roll(), set()) */ public void Test4409072() { - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } diff --git a/jdk/test/java/util/Locale/LocaleCategory.java b/jdk/test/java/util/Locale/LocaleCategory.java index 95cf30967ea..f9392f4a132 100644 --- a/jdk/test/java/util/Locale/LocaleCategory.java +++ b/jdk/test/java/util/Locale/LocaleCategory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -30,6 +30,11 @@ public class LocaleCategory { public static void main(String[] args) { Locale reservedLocale = Locale.getDefault(); + if (TestUtils.hasSpecialVariant(reservedLocale)) { + System.out.println("Skipping this test because locale is " + reservedLocale); + return; + } + try { Locale.Builder builder = new Locale.Builder(); diff --git a/jdk/test/java/util/Locale/LocaleCategory.sh b/jdk/test/java/util/Locale/LocaleCategory.sh index 989556a2477..a613b079b11 100644 --- a/jdk/test/java/util/Locale/LocaleCategory.sh +++ b/jdk/test/java/util/Locale/LocaleCategory.sh @@ -26,7 +26,8 @@ # @bug 4700857 6997928 7079486 # @summary tests for Locale.getDefault(Locale.Category) and # Locale.setDefault(Locale.Category, Locale) -# @build LocaleCategory +# @library /java/text/testlib +# @build LocaleCategory TestUtils # @run shell/timeout=600 LocaleCategory.sh if [ "${TESTSRC}" = "" ] @@ -46,7 +47,9 @@ then echo "TESTCLASSES not set. Test cannot execute. Failed." exit 1 fi + echo "TESTCLASSES=${TESTCLASSES}" +echo "TESTCLASSPATH=${TESTCLASSPATH}" echo "CLASSPATH=${CLASSPATH}" # set platform-dependent variables @@ -69,7 +72,7 @@ esac # test user.xxx.display user.xxx.format properties # run -RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSES} -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" +RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSPATH} -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" echo ${RUNCMD} ${RUNCMD} @@ -85,7 +88,7 @@ fi # test user.xxx properties overriding user.xxx.display/format # run -RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSES} -Duser.language=en -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" +RUNCMD="${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -classpath ${TESTCLASSPATH} -Duser.language=en -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" echo ${RUNCMD} ${RUNCMD} diff --git a/jdk/test/java/util/TimeZone/Bug4322313.java b/jdk/test/java/util/TimeZone/Bug4322313.java index fdd1f7c92ce..a65a87149b9 100644 --- a/jdk/test/java/util/TimeZone/Bug4322313.java +++ b/jdk/test/java/util/TimeZone/Bug4322313.java @@ -90,7 +90,9 @@ public class Bug4322313 extends IntlTest { TimeZone.setDefault(TimeZone.getTimeZone("GMT")); for (int i = 0; i < locs.length; i++) { - Locale.setDefault(locs[i]); + Locale locale = locs[i]; + Locale.setDefault(locale); + /* Okay case */ for (int k = 0; k < VALIDS.length; k++) { @@ -100,12 +102,12 @@ public class Bug4322313 extends IntlTest { if (!tz.getID().equals(VALIDS[k][2])) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] Invalid TimeZone ID, expected:" + VALIDS[k][2] + ", got:" + tz.getID() + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] Valid TimeZone ID, got:" + VALIDS[k][2]); } @@ -113,12 +115,12 @@ public class Bug4322313 extends IntlTest { if (offset != (int)VALIDS[k][1]) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] Invalid RawOffset, expected:" + VALIDS[k][1] + ", got:" + offset + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] Vaild RawOffset, got:" + offset); } @@ -126,12 +128,12 @@ public class Bug4322313 extends IntlTest { if (offset != 0) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] DSTSavings should be zero, got:" + offset + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + VALIDS[k][0] + + locale + ", \"" + VALIDS[k][0] + "\"] DSTSavings is zero."); } } @@ -144,12 +146,12 @@ public class Bug4322313 extends IntlTest { if (!tz.getID().equals("GMT")) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] Invalid TimeZone ID, expected:GMT, got:" + tz.getID() + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] Valid TimeZone ID, got:" + tz.getID()); } @@ -157,12 +159,12 @@ public class Bug4322313 extends IntlTest { if (offset != 0) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] RawOffset should be zero, got:" + offset + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] RawOffset is zero."); } @@ -170,12 +172,12 @@ public class Bug4322313 extends IntlTest { if (offset != 0) { err = true; System.err.println("\tFailed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] DSTSavings should be zero, got:" + offset + ", " + tz); } else { logln("\tPassed [Locale=" + - Locale.getDefault() + ", \"" + INVALIDS[k] + + locale + ", \"" + INVALIDS[k] + "\"] DSTSavings is zero."); } } @@ -189,25 +191,25 @@ public class Bug4322313 extends IntlTest { if (!normalizedID.equals(s)) { err = true; System.err.println("getDisplayName returned unexpected name: " + s + - " in " + Locale.getDefault()); + " in " + locale); } s = tz.getDisplayName(true, tz.SHORT); if (!normalizedID.equals(s)) { err = true; System.err.println("getDisplayName returned unexpected name: " + s + - " in " + Locale.getDefault()); + " in " + locale); } s = tz.getDisplayName(false, tz.LONG); if (!normalizedID.equals(s)) { err = true; System.err.println("getDisplayName returned unexpected name: " + s + - " in " + Locale.getDefault()); + " in " + locale); } s = tz.getDisplayName(false, tz.SHORT); if (!normalizedID.equals(s)) { err = true; System.err.println("getDisplayName returned unexpected name: " + s + - " in " + Locale.getDefault()); + " in " + locale); } } } diff --git a/jdk/test/java/util/TimeZone/TimeZoneRegression.java b/jdk/test/java/util/TimeZone/TimeZoneRegression.java index 8b9e2f4a22a..3dabbe49119 100644 --- a/jdk/test/java/util/TimeZone/TimeZoneRegression.java +++ b/jdk/test/java/util/TimeZone/TimeZoneRegression.java @@ -40,15 +40,6 @@ public class TimeZoneRegression extends IntlTest { new TimeZoneRegression().run(args); } - public void Test4052967() { - logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***"); - String id = TimeZone.getDefault().getID(); - logln("user.timezone: " + System.getProperty("user.timezone", "")); - logln("TimeZone.getDefault().getID(): " + id); - logln(new Date().toString()); - logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***"); - } - public void Test4073209() { TimeZone z1 = TimeZone.getTimeZone("PST"); TimeZone z2 = TimeZone.getTimeZone("PST"); @@ -167,11 +158,14 @@ public class TimeZoneRegression extends IntlTest { } public void Test4109314() { - // test both SimpleTimeZone and ZoneInfo objects. - // @since 1.4 - if (Locale.getDefault().equals(new Locale("th", "TH"))) { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); return; } + + // test both SimpleTimeZone and ZoneInfo objects. + // @since 1.4 sub4109314(getPST()); sub4109314(TimeZone.getTimeZone("PST")); } @@ -291,6 +285,12 @@ public class TimeZoneRegression extends IntlTest { * When you fix these two problems, the test passes, as expected. */ public void Test4126678() { + Locale locale = Locale.getDefault(); + if (!TestUtils.usesGregorianCalendar(locale)) { + logln("Skipping this test because locale is " + locale); + return; + } + // Note: this test depends on the PST time zone. TimeZone initialZone = TimeZone.getDefault(); From 97f26b209745b0c1943a66157dbd6ea16133b3ca Mon Sep 17 00:00:00 2001 From: Rachna Goel Date: Mon, 22 Aug 2016 14:55:11 +0900 Subject: [PATCH 110/115] 8163350: LocaleProviderAdapter Preference list retrieved is wrong, when -Djava.locale.providers=COMPAT Reviewed-by: naoto, okutsu --- .../provider/LocaleProviderAdapter.java | 6 +-- .../sun/util/locale/provider/Bug8163350.java | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 jdk/test/sun/util/locale/provider/Bug8163350.java diff --git a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java index a5ab411adb4..bafb81976d7 100644 --- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java +++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, 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 @@ -143,8 +143,8 @@ public abstract class LocaleProviderAdapter { defaultLocaleProviderAdapter = Type.CLDR; if (!typeList.isEmpty()) { // bona fide preference exists - if (!typeList.contains(Type.CLDR)) { - // Append FALLBACK as the last resort. + if (!(typeList.contains(Type.CLDR) || (typeList.contains(Type.JRE)))) { + // Append FALLBACK as the last resort when no ResourceBundleBasedAdapter is available. typeList.add(Type.FALLBACK); defaultLocaleProviderAdapter = Type.FALLBACK; } diff --git a/jdk/test/sun/util/locale/provider/Bug8163350.java b/jdk/test/sun/util/locale/provider/Bug8163350.java new file mode 100644 index 00000000000..5cda3f16adc --- /dev/null +++ b/jdk/test/sun/util/locale/provider/Bug8163350.java @@ -0,0 +1,45 @@ +/* + * 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 8163350 + * @modules java.base/sun.util.locale.provider + * @summary Test FALLBACK provider is not in adapter preference list when + * COMPAT is specified with System Property java.locale.providers. + * @run main/othervm -Djava.locale.providers=COMPAT Bug8163350 + */ +import java.util.List; +import sun.util.locale.provider.LocaleProviderAdapter; +import sun.util.locale.provider.LocaleProviderAdapter.Type; + +public class Bug8163350 { + + public static void main(String[] args) { + List preferenceList = LocaleProviderAdapter.getAdapterPreference(); + if (preferenceList.contains(Type.FALLBACK)) { + throw new RuntimeException("FALLBACK Provider should not be returned in " + + "adapter list " + preferenceList); + } + } +} From b19bd0a798c8c78f482e99c2be3c9da681ca7880 Mon Sep 17 00:00:00 2001 From: Rachna Goel Date: Mon, 22 Aug 2016 15:17:11 +0900 Subject: [PATCH 111/115] 8135055: java.util.Date.after(java.sql.Timestamp ) does not return correct results Reviewed-by: okutsu --- .../share/classes/java/util/Date.java | 5 +- jdk/test/java/util/Date/Bug8135055.java | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 jdk/test/java/util/Date/Bug8135055.java diff --git a/jdk/src/java.base/share/classes/java/util/Date.java b/jdk/src/java.base/share/classes/java/util/Date.java index fe2cbc2cf0c..017ea0fef01 100644 --- a/jdk/src/java.base/share/classes/java/util/Date.java +++ b/jdk/src/java.base/share/classes/java/util/Date.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -952,6 +952,9 @@ public class Date * without affecting its internal state. */ static final long getMillisOf(Date date) { + if (date.getClass() != Date.class) { + return date.getTime(); + } if (date.cdate == null || date.cdate.isNormalized()) { return date.fastTime; } diff --git a/jdk/test/java/util/Date/Bug8135055.java b/jdk/test/java/util/Date/Bug8135055.java new file mode 100644 index 00000000000..b0d1c144caa --- /dev/null +++ b/jdk/test/java/util/Date/Bug8135055.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. + */ + +/* + * @test + * @bug 8135055 + * @summary Test java.sql.TimeStamp instance should come after java.util.Date + * if Nanos component of TimeStamp is not equal to 0 milliseconds. +*/ +import java.sql.Timestamp; +import java.util.Date; + +public class Bug8135055 { + + public static void main(String[] args) throws InterruptedException { + for (int i = 0; i < 1000; i++) { + Date d = new Date(); + Timestamp ts = new Timestamp(d.getTime()); + if (d.after(ts)) { + throw new RuntimeException("date with time " + d.getTime() + + " should not be after TimeStamp , Nanos component of " + + "TimeStamp is " +ts.getNanos()); + } + Thread.sleep(1); + } + } +} From 3337ddec8dd9ed9efac96932d3c3b4adbf05a83c Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Mon, 22 Aug 2016 06:52:58 -0400 Subject: [PATCH 112/115] 8164515: Add back javadoc module description for java.se.ee Reviewed-by: tbell --- jdk/src/java.se.ee/share/classes/module-info.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jdk/src/java.se.ee/share/classes/module-info.java b/jdk/src/java.se.ee/share/classes/module-info.java index 6d4a11fc70a..d611f5ef522 100644 --- a/jdk/src/java.se.ee/share/classes/module-info.java +++ b/jdk/src/java.se.ee/share/classes/module-info.java @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the full API of the Java SE Platform. + *

+ * This module requires {@code java.se} and supplements it with modules + * that define CORBA and Java EE APIs. These modules are upgradeable. + */ module java.se.ee { requires public java.se; From b0aa08888c16507bae9b3349d315415367350853 Mon Sep 17 00:00:00 2001 From: Peter Levart Date: Mon, 22 Aug 2016 13:16:51 +0200 Subject: [PATCH 113/115] 8164547: Make java.lang.reflect.ClassLoaderValue public for internal use Move it to jdk.internal.loader and make it public Reviewed-by: shade, alanb --- .../classes/java/lang/reflect/Proxy.java | 3 +- .../loader}/AbstractClassLoaderValue.java | 8 ++--- .../internal/loader}/ClassLoaderValue.java | 4 +-- .../lang/reflect/ClassLoaderValue/Driver.java | 35 ------------------- .../ClassLoaderValueTest.java | 8 +++-- 5 files changed, 12 insertions(+), 46 deletions(-) rename jdk/src/java.base/share/classes/{java/lang/reflect => jdk/internal/loader}/AbstractClassLoaderValue.java (98%) rename jdk/src/java.base/share/classes/{java/lang/reflect => jdk/internal/loader}/ClassLoaderValue.java (98%) delete mode 100644 jdk/test/java/lang/reflect/ClassLoaderValue/Driver.java rename jdk/test/{java/lang/reflect/ClassLoaderValue/java.base/java/lang/reflect => jdk/internal/loader/ClassLoaderValue}/ClassLoaderValueTest.java (98%) diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java index 450930fb929..ba2632b5445 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java @@ -29,11 +29,9 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Arrays; import java.util.Collections; -import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -49,6 +47,7 @@ import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; +import jdk.internal.loader.ClassLoaderValue; import sun.reflect.misc.ReflectUtil; import sun.security.action.GetPropertyAction; import sun.security.util.SecurityConstants; diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/AbstractClassLoaderValue.java b/jdk/src/java.base/share/classes/jdk/internal/loader/AbstractClassLoaderValue.java similarity index 98% rename from jdk/src/java.base/share/classes/java/lang/reflect/AbstractClassLoaderValue.java rename to jdk/src/java.base/share/classes/jdk/internal/loader/AbstractClassLoaderValue.java index 1689f5d74e3..fe1342cf662 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/AbstractClassLoaderValue.java +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/AbstractClassLoaderValue.java @@ -21,12 +21,12 @@ * questions. */ -package java.lang.reflect; +package jdk.internal.loader; -import jdk.internal.loader.BootLoader; import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.SharedSecrets; +import java.lang.reflect.UndeclaredThrowableException; import java.util.Iterator; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -40,7 +40,7 @@ import java.util.function.Supplier; * @param the type of concrete ClassLoaderValue (this type) * @param the type of values associated with ClassLoaderValue */ -abstract class AbstractClassLoaderValue, V> { +public abstract class AbstractClassLoaderValue, V> { /** * Sole constructor. @@ -377,7 +377,7 @@ abstract class AbstractClassLoaderValue the type of {@link #key()} component contained in the * sub-ClassLoaderValue. */ - final class Sub extends AbstractClassLoaderValue, V> { + public final class Sub extends AbstractClassLoaderValue, V> { private final K key; diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/ClassLoaderValue.java b/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaderValue.java similarity index 98% rename from jdk/src/java.base/share/classes/java/lang/reflect/ClassLoaderValue.java rename to jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaderValue.java index 4b550871676..a1f55f01872 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/ClassLoaderValue.java +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaderValue.java @@ -21,7 +21,7 @@ * questions. */ -package java.lang.reflect; +package jdk.internal.loader; import java.util.Objects; import java.util.function.BiFunction; @@ -74,7 +74,7 @@ import java.util.function.BiFunction; * @author Peter Levart * @since 9 */ -final class ClassLoaderValue +public final class ClassLoaderValue extends AbstractClassLoaderValue, V> { /** diff --git a/jdk/test/java/lang/reflect/ClassLoaderValue/Driver.java b/jdk/test/java/lang/reflect/ClassLoaderValue/Driver.java deleted file mode 100644 index e20d9da7641..00000000000 --- a/jdk/test/java/lang/reflect/ClassLoaderValue/Driver.java +++ /dev/null @@ -1,35 +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. - */ - -/** - * @test - * @bug 8152115 - * @summary functional and concurrency test for ClassLoaderValue - * @build java.base/java.lang.reflect.ClassLoaderValueTest - * @run main Driver - */ -public class Driver { - public static void main(String[] args) throws Exception { - java.lang.reflect.ClassLoaderValueTest.main(args); - } -} diff --git a/jdk/test/java/lang/reflect/ClassLoaderValue/java.base/java/lang/reflect/ClassLoaderValueTest.java b/jdk/test/jdk/internal/loader/ClassLoaderValue/ClassLoaderValueTest.java similarity index 98% rename from jdk/test/java/lang/reflect/ClassLoaderValue/java.base/java/lang/reflect/ClassLoaderValueTest.java rename to jdk/test/jdk/internal/loader/ClassLoaderValue/ClassLoaderValueTest.java index ff928c13ac4..77e850f9796 100644 --- a/jdk/test/java/lang/reflect/ClassLoaderValue/java.base/java/lang/reflect/ClassLoaderValueTest.java +++ b/jdk/test/jdk/internal/loader/ClassLoaderValue/ClassLoaderValueTest.java @@ -21,7 +21,7 @@ * questions. */ -package java.lang.reflect; +import jdk.internal.loader.ClassLoaderValue; import java.util.ArrayList; import java.util.List; @@ -34,8 +34,10 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; /** - * Functional and concurrency test for ClassLoaderValue - * + * @test + * @bug 8152115 + * @summary functional and concurrency test for ClassLoaderValue + * @modules java.base/jdk.internal.loader * @author Peter Levart */ public class ClassLoaderValueTest { From 86a27697b7cbd3c1dea636688c1982ce2e94a354 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Mon, 22 Aug 2016 12:57:43 +0200 Subject: [PATCH 114/115] 8164525: Re-examine zero form link time pre-generation Reviewed-by: vlivanov, forax --- .../java/lang/invoke/GenerateJLIClassesHelper.java | 10 +++++++++- .../java/lang/invoke/InvokerBytecodeGenerator.java | 1 + .../share/classes/java/lang/invoke/LambdaForm.java | 6 ++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java index 38432e15258..714e6268d25 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -43,8 +43,16 @@ class GenerateJLIClassesHelper { ArrayList names = new ArrayList<>(); HashSet dedupSet = new HashSet<>(); for (LambdaForm.BasicType type : LambdaForm.BasicType.values()) { + LambdaForm zero = LambdaForm.zeroForm(type); + String name = zero.kind.defaultLambdaName + + "_" + zero.returnType().basicTypeChar(); + if (dedupSet.add(name)) { + names.add(name); + forms.add(zero); + } + LambdaForm identity = LambdaForm.identityForm(type); - String name = identity.kind.defaultLambdaName + name = identity.kind.defaultLambdaName + "_" + identity.returnType().basicTypeChar(); if (dedupSet.add(name)) { names.add(name); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index c2efac045f1..6b9a2703be2 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -624,6 +624,7 @@ class InvokerBytecodeGenerator { return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); } case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class); + case ZERO: // fall-through case IDENTITY: { name = name + "_" + form.returnType().basicTypeChar(); return resolveFrom(name, invokerType, LambdaForm.Holder.class); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index e4417baad71..a7c84c823ea 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -1860,13 +1860,15 @@ class LambdaForm { Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) }; idForm = new LambdaForm(idMem.getName(), 2, idNames, 1, Kind.IDENTITY); idForm.compileToBytecode(); - idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm)); + idFun = new NamedFunction(idMem, MethodHandleImpl.makeIntrinsic( + idMem.getInvocationType(), idForm, MethodHandleImpl.Intrinsic.IDENTITY)); Object zeValue = Wrapper.forBasicType(btChar).zero(); Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) }; zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1, Kind.ZERO); zeForm.compileToBytecode(); - zeFun = new NamedFunction(zeMem, SimpleMethodHandle.make(zeMem.getInvocationType(), zeForm)); + zeFun = new NamedFunction(zeMem, MethodHandleImpl.makeIntrinsic( + zeMem.getInvocationType(), zeForm, MethodHandleImpl.Intrinsic.ZERO)); } LF_zero[ord] = zeForm; From ffafa6e0c8b911dda1e5951cf62f279dae1b9a57 Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Mon, 22 Aug 2016 08:50:40 -0400 Subject: [PATCH 115/115] 8164397: Provide javadoc descriptions for the jdk.security.auth and jdk.security.jgss modules Reviewed-by: weijun, xuelei --- jdk/src/jdk.security.auth/share/classes/module-info.java | 6 +++++- jdk/src/jdk.security.jgss/share/classes/module-info.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/jdk/src/jdk.security.auth/share/classes/module-info.java b/jdk/src/jdk.security.auth/share/classes/module-info.java index 06ddb84ceb9..8f97ca43956 100644 --- a/jdk/src/jdk.security.auth/share/classes/module-info.java +++ b/jdk/src/jdk.security.auth/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * 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 @@ -23,6 +23,10 @@ * questions. */ +/** + * Contains the implementation of the javax.security.auth.* interfaces and + * various authentication modules. + */ module jdk.security.auth { requires public java.naming; requires java.security.jgss; diff --git a/jdk/src/jdk.security.jgss/share/classes/module-info.java b/jdk/src/jdk.security.jgss/share/classes/module-info.java index 14978458629..9701e2a2b82 100644 --- a/jdk/src/jdk.security.jgss/share/classes/module-info.java +++ b/jdk/src/jdk.security.jgss/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * 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 @@ -23,6 +23,10 @@ * questions. */ +/** + * Defines Java extensions to the GSS-API and an implementation of the SASL + * GSSAPI mechanism. + */ module jdk.security.jgss { requires public java.security.jgss; requires java.logging;