File 0001-illegal-reflective-access.patch of Package groovy
From 301204fcec55c76dcf6a1dc162262791bbae62bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fridrich=20=C5=A0trba?= <fridrich.strba@bluewin.ch>
Date: Fri, 20 May 2022 18:15:52 +0200
Subject: [PATCH] illegal reflective access
---
build.gradle | 16 +
src/main/groovy/lang/MetaClassImpl.java | 12 +-
src/main/groovy/transform/Internal.java | 32 +
src/main/org/apache/groovy/util/Maps.java | 5820 +++++++++++++++++
.../org/codehaus/groovy/ast/PackageNode.java | 90 +-
.../groovy/ast/tools/GeneralUtils.java | 20 +
.../groovy/classgen/asm/util/TypeUtil.java | 216 +
.../reflection/AccessPermissionChecker.java | 100 +
.../CacheAccessControlException.java | 29 +
.../groovy/reflection/CachedClass.java | 76 +-
.../groovy/reflection/CachedConstructor.java | 43 +-
.../groovy/reflection/CachedField.java | 36 +-
.../groovy/reflection/CachedMethod.java | 62 +-
.../ClassLoaderForClassArtifacts.java | 8 +-
.../groovy/reflection/MixinInMetaClass.java | 7 +-
.../groovy/reflection/ReflectionUtils.java | 94 +-
.../groovy/runtime/DefaultGroovyMethods.java | 5 +-
.../runtime/callsite/CallSiteArray.java | 4 +-
.../runtime/callsite/CallSiteGenerator.java | 12 +-
.../runtime/callsite/CallSiteHelper.java | 33 +
.../callsite/GetEffectivePogoFieldSite.java | 2 +-
.../callsite/GetEffectivePojoFieldSite.java | 2 +-
.../runtime/callsite/MetaMethodSite.java | 2 +-
.../runtime/callsite/PogoMetaMethodSite.java | 3 +
.../runtime/callsite/PojoMetaMethodSite.java | 4 +-
.../metaclass/MetaClassRegistryImpl.java | 2 +-
.../metaclass/MethodSelectionException.java | 13 +-
.../codehaus/groovy/tools/DgmConverter.java | 2 +-
.../codehaus/groovy/vmplugin/VMPlugin.java | 40 +-
.../codehaus/groovy/vmplugin/v5/Java5.java | 167 +-
.../codehaus/groovy/vmplugin/v7/Java7.java | 72 +-
.../codehaus/groovy/vmplugin/v7/Selector.java | 4 +-
.../codehaus/groovy/vmplugin/v9/Java9.java | 253 +
src/test/groovy/bugs/Groovy8339Bug.groovy | 27 +
.../groovy/reflection/SecurityTest.java | 278 +
.../src/main/java/groovy/util/AntBuilder.java | 5 +-
.../java/org/codehaus/groovy/ant/Groovy.java | 3 +-
.../tools/shell/util/PackageHelperImpl.groovy | 4 +-
.../groovy/binding/ClosureTriggerBinding.java | 5 +-
.../groovy/beans/BindableSwingTest.groovy | 11 +
40 files changed, 7354 insertions(+), 260 deletions(-)
create mode 100644 src/main/groovy/transform/Internal.java
create mode 100644 src/main/org/apache/groovy/util/Maps.java
create mode 100644 src/main/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
create mode 100644 src/main/org/codehaus/groovy/reflection/AccessPermissionChecker.java
create mode 100644 src/main/org/codehaus/groovy/reflection/CacheAccessControlException.java
create mode 100644 src/main/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
create mode 100644 src/main/org/codehaus/groovy/vmplugin/v9/Java9.java
create mode 100644 src/test/groovy/bugs/Groovy8339Bug.groovy
create mode 100644 src/test/org/codehaus/groovy/reflection/SecurityTest.java
diff --git a/build.gradle b/build.gradle
index a9c2f70cd8..ea33c6d5b7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -264,6 +264,10 @@ sourceSets {
exclude '**/v8/*'
exclude '**/vm7/*'
}
+ if (!JavaVersion.current().isJava9Compatible()) {
+ exclude '**/v9/*'
+ exclude '**/vm9/*'
+ }
}
groovy {
srcDirs = [
@@ -276,6 +280,10 @@ sourceSets {
exclude '**/v8/*'
exclude '**/vm7/*'
}
+ if (!JavaVersion.current().isJava9Compatible()) {
+ exclude '**/v9/*'
+ exclude '**/vm9/*'
+ }
}
resources {
srcDirs = ['src/main', 'src/resources']
@@ -287,6 +295,14 @@ sourceSets {
test {
groovy {
srcDirs = ['src/test']
+ if (!JavaVersion.current().isJava8Compatible()) {
+ exclude '**/v8/*'
+ exclude '**/vm8/*'
+ }
+ if (!JavaVersion.current().isJava9Compatible()) {
+ exclude '**/v9/*'
+ exclude '**/vm9/*'
+ }
}
resources {
srcDirs = ['src/test-resources']
diff --git a/src/main/groovy/lang/MetaClassImpl.java b/src/main/groovy/lang/MetaClassImpl.java
index 972c060fb2..7a90a417df 100644
--- a/src/main/groovy/lang/MetaClassImpl.java
+++ b/src/main/groovy/lang/MetaClassImpl.java
@@ -104,6 +104,9 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.inSamePackage;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.isDefaultVisibility;
+
/**
* Allows methods to be dynamically added to existing classes at runtime
*
@@ -1399,11 +1402,11 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
public Constructor retrieveConstructor(Class[] arguments) {
CachedConstructor constructor = (CachedConstructor) chooseMethod("<init>", constructors, arguments);
if (constructor != null) {
- return constructor.cachedConstructor;
+ return constructor.getCachedConstructor();
}
constructor = (CachedConstructor) chooseMethod("<init>", constructors, arguments);
if (constructor != null) {
- return constructor.cachedConstructor;
+ return constructor.getCachedConstructor();
}
return null;
}
@@ -2404,10 +2407,7 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
private static boolean packageLocal(CachedField mfp, CachedClass klass) {
if ((mfp.getModifiers() & (Modifier.PRIVATE | Modifier.PUBLIC | Modifier.PROTECTED)) != 0 || klass == null)
return false;
- Package fieldPackage = mfp.field.getDeclaringClass().getPackage();
- Package classPackage = klass.getTheClass().getPackage();
- return (fieldPackage == null && classPackage == null) ||
- fieldPackage != null && classPackage != null && fieldPackage.getName().equals(classPackage.getName());
+ return isDefaultVisibility(mfp.getModifiers()) && inSamePackage(mfp.getDeclaringClass(), klass.getTheClass());
}
private void applyStrayPropertyMethods(LinkedList<CachedClass> superClasses, Index classPropertyIndex, boolean isThis) {
diff --git a/src/main/groovy/transform/Internal.java b/src/main/groovy/transform/Internal.java
new file mode 100644
index 0000000000..a645f81c8c
--- /dev/null
+++ b/src/main/groovy/transform/Internal.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package groovy.transform;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The Internal annotation is used to mark members that are internal.
+ */
+@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Internal {
+}
diff --git a/src/main/org/apache/groovy/util/Maps.java b/src/main/org/apache/groovy/util/Maps.java
new file mode 100644
index 0000000000..b560a4f7d9
--- /dev/null
+++ b/src/main/org/apache/groovy/util/Maps.java
@@ -0,0 +1,5820 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.groovy.util;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Map utilities.
+ * @since 2.5.0
+ */
+public abstract class Maps {
+
+ public static <K, V> Map<K, V> of(K k1, V v1) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95, K k96, V v96) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+ map.put(k96, v96);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95, K k96, V v96, K k97, V v97) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+ map.put(k96, v96);
+ map.put(k97, v97);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95, K k96, V v96, K k97, V v97, K k98, V v98) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+ map.put(k96, v96);
+ map.put(k97, v97);
+ map.put(k98, v98);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95, K k96, V v96, K k97, V v97, K k98, V v98, K k99, V v99) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+ map.put(k96, v96);
+ map.put(k97, v97);
+ map.put(k98, v98);
+ map.put(k99, v99);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34, K k35, V v35, K k36, V v36, K k37, V v37, K k38, V v38, K k39, V v39, K k40, V v40, K k41, V v41, K k42, V v42, K k43, V v43, K k44, V v44, K k45, V v45, K k46, V v46, K k47, V v47, K k48, V v48, K k49, V v49, K k50, V v50, K k51, V v51, K k52, V v52, K k53, V v53, K k54, V v54, K k55, V v55, K k56, V v56, K k57, V v57, K k58, V v58, K k59, V v59, K k60, V v60, K k61, V v61, K k62, V v62, K k63, V v63, K k64, V v64, K k65, V v65, K k66, V v66, K k67, V v67, K k68, V v68, K k69, V v69, K k70, V v70, K k71, V v71, K k72, V v72, K k73, V v73, K k74, V v74, K k75, V v75, K k76, V v76, K k77, V v77, K k78, V v78, K k79, V v79, K k80, V v80, K k81, V v81, K k82, V v82, K k83, V v83, K k84, V v84, K k85, V v85, K k86, V v86, K k87, V v87, K k88, V v88, K k89, V v89, K k90, V v90, K k91, V v91, K k92, V v92, K k93, V v93, K k94, V v94, K k95, V v95, K k96, V v96, K k97, V v97, K k98, V v98, K k99, V v99, K k100, V v100) {
+ Map<K, V> map = new LinkedHashMap<K, V>();
+
+ map.put(k1, v1);
+ map.put(k2, v2);
+ map.put(k3, v3);
+ map.put(k4, v4);
+ map.put(k5, v5);
+ map.put(k6, v6);
+ map.put(k7, v7);
+ map.put(k8, v8);
+ map.put(k9, v9);
+ map.put(k10, v10);
+ map.put(k11, v11);
+ map.put(k12, v12);
+ map.put(k13, v13);
+ map.put(k14, v14);
+ map.put(k15, v15);
+ map.put(k16, v16);
+ map.put(k17, v17);
+ map.put(k18, v18);
+ map.put(k19, v19);
+ map.put(k20, v20);
+ map.put(k21, v21);
+ map.put(k22, v22);
+ map.put(k23, v23);
+ map.put(k24, v24);
+ map.put(k25, v25);
+ map.put(k26, v26);
+ map.put(k27, v27);
+ map.put(k28, v28);
+ map.put(k29, v29);
+ map.put(k30, v30);
+ map.put(k31, v31);
+ map.put(k32, v32);
+ map.put(k33, v33);
+ map.put(k34, v34);
+ map.put(k35, v35);
+ map.put(k36, v36);
+ map.put(k37, v37);
+ map.put(k38, v38);
+ map.put(k39, v39);
+ map.put(k40, v40);
+ map.put(k41, v41);
+ map.put(k42, v42);
+ map.put(k43, v43);
+ map.put(k44, v44);
+ map.put(k45, v45);
+ map.put(k46, v46);
+ map.put(k47, v47);
+ map.put(k48, v48);
+ map.put(k49, v49);
+ map.put(k50, v50);
+ map.put(k51, v51);
+ map.put(k52, v52);
+ map.put(k53, v53);
+ map.put(k54, v54);
+ map.put(k55, v55);
+ map.put(k56, v56);
+ map.put(k57, v57);
+ map.put(k58, v58);
+ map.put(k59, v59);
+ map.put(k60, v60);
+ map.put(k61, v61);
+ map.put(k62, v62);
+ map.put(k63, v63);
+ map.put(k64, v64);
+ map.put(k65, v65);
+ map.put(k66, v66);
+ map.put(k67, v67);
+ map.put(k68, v68);
+ map.put(k69, v69);
+ map.put(k70, v70);
+ map.put(k71, v71);
+ map.put(k72, v72);
+ map.put(k73, v73);
+ map.put(k74, v74);
+ map.put(k75, v75);
+ map.put(k76, v76);
+ map.put(k77, v77);
+ map.put(k78, v78);
+ map.put(k79, v79);
+ map.put(k80, v80);
+ map.put(k81, v81);
+ map.put(k82, v82);
+ map.put(k83, v83);
+ map.put(k84, v84);
+ map.put(k85, v85);
+ map.put(k86, v86);
+ map.put(k87, v87);
+ map.put(k88, v88);
+ map.put(k89, v89);
+ map.put(k90, v90);
+ map.put(k91, v91);
+ map.put(k92, v92);
+ map.put(k93, v93);
+ map.put(k94, v94);
+ map.put(k95, v95);
+ map.put(k96, v96);
+ map.put(k97, v97);
+ map.put(k98, v98);
+ map.put(k99, v99);
+ map.put(k100, v100);
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ /**
+ * Returns the inverse view of this map, and duplicated key is not allowed
+ *
+ * @param map the map to inverse
+ * @param <K> key type
+ * @param <V> value type
+ * @return the inverse view of this map
+ */
+ public static <K, V> Map<V, K> inverse(Map<K, V> map) {
+ return inverse(map, false);
+ }
+
+ /**
+ * Returns the inverse view of this map
+ *
+ * @param map the map to inverse
+ * @param force whether to put anyway even if duplicated key exists
+ * @param <K> key type
+ * @param <V> value type
+ * @return the inverse view of this map
+ */
+ public static <K, V> Map<V, K> inverse(Map<K, V> map, boolean force) {
+ // Because we can not rely on 3rd party library(excluding antlr, asm), we have to implement our own utils such as the `inverse` method...
+ // Actually `BiMap` of Guava and `BidiMap` of commons-collections are both suitable for this scenario.
+
+ Map<V, K> resultMap = new LinkedHashMap<>();
+
+ for (Map.Entry<K, V> entry : map.entrySet()) {
+ V value = entry.getValue();
+
+ if (!force && resultMap.containsKey(value)) {
+ throw new IllegalArgumentException("duplicated key found: " + value);
+ }
+
+ resultMap.put(value, entry.getKey());
+ }
+
+ return Collections.<V, K>unmodifiableMap(resultMap);
+ }
+}
diff --git a/src/main/org/codehaus/groovy/ast/PackageNode.java b/src/main/org/codehaus/groovy/ast/PackageNode.java
index d4fb15a258..097c7f924a 100644
--- a/src/main/org/codehaus/groovy/ast/PackageNode.java
+++ b/src/main/org/codehaus/groovy/ast/PackageNode.java
@@ -1,46 +1,44 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.codehaus.groovy.ast;
-
-/**
- * Represents a package in the AST.
- *
- * @author Paul King
- */
-public class PackageNode extends AnnotatedNode {
- private String name;
-
- public PackageNode(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- /**
- * @return the text display of this package definition
- */
- public String getText() {
- return "package " + name;
- }
-
- public void visit(GroovyCodeVisitor visitor) {
- }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.ast;
+
+/**
+ * Represents a package in the AST.
+ */
+public class PackageNode extends AnnotatedNode {
+ private final String name;
+
+ public PackageNode(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the text display of this package definition
+ */
+ public String getText() {
+ return "package " + name;
+ }
+
+ public void visit(GroovyCodeVisitor visitor) {
+ }
+}
diff --git a/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java b/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java
index f6455e5abd..4c809099f7 100644
--- a/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -24,6 +24,7 @@ import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.FieldNode;
import org.codehaus.groovy.ast.MethodNode;
+import org.codehaus.groovy.ast.PackageNode;
import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.PropertyNode;
import org.codehaus.groovy.ast.Variable;
@@ -61,6 +62,7 @@ import org.codehaus.groovy.syntax.Token;
import org.codehaus.groovy.syntax.Types;
import org.codehaus.groovy.transform.AbstractASTTransformation;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
@@ -466,6 +468,24 @@ public class GeneralUtils {
return false;
}
+ public static boolean inSamePackage(final ClassNode first, final ClassNode second) {
+ PackageNode firstPackage = first.getPackage();
+ PackageNode secondPackage = second.getPackage();
+ return ((firstPackage == null && secondPackage == null) ||
+ firstPackage != null && secondPackage != null && firstPackage.getName().equals(secondPackage.getName()));
+ }
+
+ public static boolean inSamePackage(final Class first, final Class second) {
+ Package firstPackage = first.getPackage();
+ Package secondPackage = second.getPackage();
+ return ((firstPackage == null && secondPackage == null) ||
+ firstPackage != null && secondPackage != null && firstPackage.getName().equals(secondPackage.getName()));
+ }
+
+ public static boolean isDefaultVisibility(final int modifiers) {
+ return (modifiers & (Modifier.PRIVATE | Modifier.PUBLIC | Modifier.PROTECTED)) == 0;
+ }
+
public static BinaryExpression hasEqualFieldX(FieldNode fNode, Expression other) {
return eqX(varX(fNode), propX(other, fNode.getName()));
}
diff --git a/src/main/org/codehaus/groovy/classgen/asm/util/TypeUtil.java b/src/main/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
new file mode 100644
index 0000000000..cae9bfa921
--- /dev/null
+++ b/src/main/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.codehaus.groovy.classgen.asm.util;
+
+import groovy.lang.Tuple2;
+import org.apache.groovy.util.Maps;
+import org.codehaus.groovy.ast.ClassNode;
+import org.objectweb.asm.Type;
+
+import java.util.Map;
+
+import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.boolean_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.byte_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.DLOAD;
+import static org.objectweb.asm.Opcodes.DRETURN;
+import static org.objectweb.asm.Opcodes.FLOAD;
+import static org.objectweb.asm.Opcodes.FRETURN;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.LLOAD;
+import static org.objectweb.asm.Opcodes.LRETURN;
+
+/**
+ * A utility for getting information of types
+ *
+ * @since 2.5.0
+ */
+public abstract class TypeUtil {
+ public static Class autoboxType(Class type) {
+ final Class res = PRIMITIVE_TYPE_TO_WRAPPED_CLASS_MAP.get(type);
+ return res == null ? type : res;
+ }
+
+ public static int getLoadInsnByType(Type type) {
+ Integer insn = PRIMITIVE_TYPE_TO_LOAD_INSN_MAP.get(type);
+
+ if (null != insn) {
+ return insn;
+ }
+
+ return ALOAD;
+ }
+
+ public static int getReturnInsnByType(Type type) {
+ Integer insn = PRIMITIVE_TYPE_TO_RETURN_INSN_MAP.get(type);
+
+ if (null != insn) {
+ return insn;
+ }
+
+ return ARETURN;
+ }
+
+ public static String getWrappedClassDescriptor(Type type) {
+ String desc = PRIMITIVE_TYPE_TO_WRAPPED_CLASS_DESCRIPTOR_MAP.get(type);
+
+ if (null != desc) {
+ return desc;
+ }
+
+ throw new IllegalArgumentException("Unexpected type class [" + type + "]");
+ }
+
+ public static boolean isPrimitiveType(Type type) {
+ return PRIMITIVE_TYPE_TO_LOAD_INSN_MAP.containsKey(type);
+ }
+
+ public static boolean isPrimitiveType(String name) {
+ return NAME_TO_PRIMITIVE_TYPE_MAP.containsKey(name);
+ }
+
+ public static boolean isPrimitiveType(ClassNode type) {
+ return PRIMITIVE_TYPE_TO_DESCRIPTION_MAP.containsKey(type);
+ }
+
+ public static String getDescriptionByType(ClassNode type) {
+ String desc = PRIMITIVE_TYPE_TO_DESCRIPTION_MAP.get(type);
+
+ if (null == desc) { // reference type
+ if (!type.isArray()) {
+ return makeRefDescription(type.getName());
+ }
+
+ StringBuilder arrayDescription = new StringBuilder(32);
+ Tuple2<ClassNode, Integer> arrayInfo = extractArrayInfo(type);
+
+ for (int i = 0, dimension = arrayInfo.getSecond(); i < dimension; i++) {
+ arrayDescription.append("[");
+ }
+
+ ClassNode componentType = arrayInfo.getFirst();
+ return arrayDescription.append(getDescriptionByType(componentType)).toString();
+ }
+
+ return desc;
+ }
+
+ public static String getDescriptionByName(String name) {
+ ClassNode type = NAME_TO_PRIMITIVE_TYPE_MAP.get(name);
+
+ if (null == type) {
+ return makeRefDescription(name);
+ }
+
+ return getDescriptionByType(type);
+ }
+
+ private static String makeRefDescription(String name) {
+ return REF_DESCRIPTION + name.replace('.', '/') + ";";
+ }
+
+ private static Tuple2<ClassNode, Integer> extractArrayInfo(ClassNode type) {
+ int dimension = 0;
+
+ do {
+ dimension++;
+ } while ((type = type.getComponentType()).isArray());
+
+ return new Tuple2<ClassNode, Integer>(type, dimension);
+ }
+
+ private static final String REF_DESCRIPTION = "L";
+ private static final Map<ClassNode, String> PRIMITIVE_TYPE_TO_DESCRIPTION_MAP = Maps.of(
+ int_TYPE, "I",
+ VOID_TYPE,"V",
+ boolean_TYPE, "Z",
+ byte_TYPE, "B",
+ char_TYPE, "C",
+ short_TYPE, "S",
+ double_TYPE, "D",
+ float_TYPE, "F",
+ long_TYPE, "J"
+ );
+
+ private static final Map<String, ClassNode> NAME_TO_PRIMITIVE_TYPE_MAP = Maps.of(
+ "int", int_TYPE,
+ "void", VOID_TYPE,
+ "boolean", boolean_TYPE,
+ "byte", byte_TYPE,
+ "char", char_TYPE,
+ "short", short_TYPE,
+ "double", double_TYPE,
+ "float", float_TYPE,
+ "long", long_TYPE
+ );
+
+ private static final Map<Type, Integer> PRIMITIVE_TYPE_TO_LOAD_INSN_MAP = Maps.of(
+ Type.BOOLEAN_TYPE, ILOAD,
+ Type.BYTE_TYPE, ILOAD,
+ Type.CHAR_TYPE, ILOAD,
+ Type.DOUBLE_TYPE, DLOAD,
+ Type.FLOAT_TYPE, FLOAD,
+ Type.INT_TYPE, ILOAD,
+ Type.LONG_TYPE, LLOAD,
+ Type.SHORT_TYPE, ILOAD
+ );
+
+ private static final Map<Type, Integer> PRIMITIVE_TYPE_TO_RETURN_INSN_MAP = Maps.of(
+ Type.BOOLEAN_TYPE, IRETURN,
+ Type.BYTE_TYPE, IRETURN,
+ Type.CHAR_TYPE, IRETURN,
+ Type.DOUBLE_TYPE, DRETURN,
+ Type.FLOAT_TYPE, FRETURN,
+ Type.INT_TYPE, IRETURN,
+ Type.LONG_TYPE, LRETURN,
+ Type.SHORT_TYPE, IRETURN
+ );
+
+ private static final Map<Type, String> PRIMITIVE_TYPE_TO_WRAPPED_CLASS_DESCRIPTOR_MAP = Maps.of(
+ Type.BOOLEAN_TYPE, "java/lang/Boolean",
+ Type.BYTE_TYPE, "java/lang/Byte",
+ Type.CHAR_TYPE, "java/lang/Character",
+ Type.DOUBLE_TYPE, "java/lang/Double",
+ Type.FLOAT_TYPE, "java/lang/Float",
+ Type.INT_TYPE, "java/lang/Integer",
+ Type.LONG_TYPE, "java/lang/Long",
+ Type.SHORT_TYPE, "java/lang/Short"
+ );
+
+ private static final Map<Class<?>, Class<?>> PRIMITIVE_TYPE_TO_WRAPPED_CLASS_MAP = Maps.<Class<?>, Class<?>>of(
+ byte.class, Byte.class,
+ boolean.class, Boolean.class,
+ char.class, Character.class,
+ double.class, Double.class,
+ float.class, Float.class,
+ int.class, Integer.class,
+ long.class, Long.class,
+ short.class, Short.class
+ );
+}
diff --git a/src/main/org/codehaus/groovy/reflection/AccessPermissionChecker.java b/src/main/org/codehaus/groovy/reflection/AccessPermissionChecker.java
new file mode 100644
index 0000000000..ae297dfd09
--- /dev/null
+++ b/src/main/org/codehaus/groovy/reflection/AccessPermissionChecker.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.reflection;
+
+import groovy.lang.GroovyObject;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ReflectPermission;
+import java.security.AccessControlException;
+
+final class AccessPermissionChecker {
+
+ private static final ReflectPermission REFLECT_PERMISSION = new ReflectPermission("suppressAccessChecks");
+
+ private AccessPermissionChecker() {
+ }
+
+ private static void checkAccessPermission(Class<?> declaringClass, final int modifiers, boolean isAccessible) {
+ final SecurityManager securityManager = System.getSecurityManager();
+ if (securityManager != null && isAccessible) {
+ if (((modifiers & Modifier.PRIVATE) != 0
+ || ((modifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) == 0
+ && packageCanNotBeAddedAnotherClass(declaringClass)))
+ && !GroovyObject.class.isAssignableFrom(declaringClass)) {
+ securityManager.checkPermission(REFLECT_PERMISSION);
+ } else if ((modifiers & (Modifier.PROTECTED)) != 0 && declaringClass.equals(ClassLoader.class)) {
+ securityManager.checkCreateClassLoader();
+ }
+ }
+ }
+
+ private static boolean packageCanNotBeAddedAnotherClass(Class<?> declaringClass) {
+ return declaringClass.getName().startsWith("java.");
+ }
+
+ static void checkAccessPermission(Method method) {
+ try {
+ checkAccessPermission(method.getDeclaringClass(), method.getModifiers(), method.isAccessible());
+ } catch (AccessControlException e) {
+ throw createCacheAccessControlExceptionOf(method, e);
+ }
+ }
+
+ static void checkAccessPermission(Constructor constructor) {
+ try {
+ checkAccessPermission(constructor.getDeclaringClass(), constructor.getModifiers(), constructor.isAccessible());
+ } catch (AccessControlException e) {
+ throw createCacheAccessControlExceptionOf(constructor, e);
+ }
+ }
+
+ private static CacheAccessControlException createCacheAccessControlExceptionOf(Method method, AccessControlException e) {
+ return new CacheAccessControlException(
+ "Groovy object can not access method " + method.getName()
+ + " cacheAccessControlExceptionOf class " + method.getDeclaringClass().getName()
+ + " with modifiers \"" + Modifier.toString(method.getModifiers()) + "\"", e);
+ }
+
+ private static CacheAccessControlException createCacheAccessControlExceptionOf(Constructor constructor, AccessControlException e) {
+ return new CacheAccessControlException(
+ "Groovy object can not access constructor " + constructor.getName()
+ + " cacheAccessControlExceptionOf class " + constructor.getDeclaringClass().getName()
+ + " with modifiers \"" + Modifier.toString(constructor.getModifiers()) + "\"", e);
+ }
+
+ static void checkAccessPermission(Field field) {
+ try {
+ checkAccessPermission(field.getDeclaringClass(), field.getModifiers(), field.isAccessible());
+ } catch (AccessControlException e) {
+ throw createCacheAccessControlExceptionOf(field, e);
+ }
+ }
+
+ private static CacheAccessControlException createCacheAccessControlExceptionOf(Field field, AccessControlException e) {
+ return new CacheAccessControlException(
+ "Groovy object can not access field " + field.getName()
+ + " cacheAccessControlExceptionOf class " + field.getDeclaringClass().getName()
+ + " with modifiers \"" + Modifier.toString(field.getModifiers()) + "\"", e);
+ }
+
+}
diff --git a/src/main/org/codehaus/groovy/reflection/CacheAccessControlException.java b/src/main/org/codehaus/groovy/reflection/CacheAccessControlException.java
new file mode 100644
index 0000000000..8dfa960ec8
--- /dev/null
+++ b/src/main/org/codehaus/groovy/reflection/CacheAccessControlException.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.reflection;
+
+import groovy.lang.GroovyRuntimeException;
+
+public class CacheAccessControlException extends GroovyRuntimeException {
+ private static final long serialVersionUID = -5315107566539656474L;
+
+ public CacheAccessControlException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/src/main/org/codehaus/groovy/reflection/CachedClass.java b/src/main/org/codehaus/groovy/reflection/CachedClass.java
index 3a4918f53f..5127f22aeb 100644
--- a/src/main/org/codehaus/groovy/reflection/CachedClass.java
+++ b/src/main/org/codehaus/groovy/reflection/CachedClass.java
@@ -31,8 +31,6 @@ import org.codehaus.groovy.util.FastArray;
import org.codehaus.groovy.util.LazyReference;
import org.codehaus.groovy.util.ReferenceBundle;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -49,9 +47,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Set;
-/**
- * @author Alex.Tkachman
- */
+import static org.codehaus.groovy.reflection.ReflectionUtils.checkCanSetAccessible;
+
public class CachedClass {
private static final Method[] EMPTY_METHOD_ARRAY = new Method[0];
private final Class cachedClass;
@@ -63,15 +60,17 @@ public class CachedClass {
private static final long serialVersionUID = 5450437842165410025L;
public CachedField[] initValue() {
- final Field[] declaredFields = (Field[])
- AccessController.doPrivileged(new PrivilegedAction<Field[]>() {
- public Field[] run() {
- Field[] df = getTheClass().getDeclaredFields();
- df = (Field[]) makeAccessible(df);
- return df;
- }
- });
- CachedField [] fields = new CachedField[declaredFields.length];
+ final Field[] declaredFields = AccessController.doPrivileged(new PrivilegedAction<Field[]>() {
+ public Field[] run() {
+ Field[] df = getTheClass().getDeclaredFields();
+ df = Arrays.stream(df)
+ .filter(f -> checkCanSetAccessible(f, CachedClass.class))
+ .toArray(Field[]::new);
+// df = (Field[]) ReflectionUtils.makeAccessible(df);
+ return df;
+ }
+ });
+ CachedField[] fields = new CachedField[declaredFields.length];
for (int i = 0; i != fields.length; ++i)
fields[i] = new CachedField(declaredFields[i]);
return fields;
@@ -83,49 +82,36 @@ public class CachedClass {
public CachedConstructor[] initValue() {
final Constructor[] declaredConstructors = (Constructor[])
- AccessController.doPrivileged(new PrivilegedAction/*<Constructor[]>*/() {
- public /*Constructor[]*/ Object run() {
- return getTheClass().getDeclaredConstructors();
+ AccessController.doPrivileged(new PrivilegedAction<Constructor[]>() {
+ public Constructor[] run() {
+ Constructor[] dc = getTheClass().getDeclaredConstructors();
+ dc = Arrays.stream(dc)
+ .filter(c -> checkCanSetAccessible(c, CachedClass.class))
+ .toArray(Constructor[]::new);
+
+ return dc;
}
});
- CachedConstructor [] constructors = new CachedConstructor[declaredConstructors.length];
+ CachedConstructor[] constructors = new CachedConstructor[declaredConstructors.length];
for (int i = 0; i != constructors.length; ++i)
constructors[i] = new CachedConstructor(CachedClass.this, declaredConstructors[i]);
return constructors;
}
};
- // to be run in PrivilegedAction!
- private static AccessibleObject[] makeAccessible(final AccessibleObject[] aoa) {
- try {
- AccessibleObject.setAccessible(aoa, true);
- return aoa;
- } catch (Throwable outer) {
- // swallow for strict security managers, module systems, android or others,
- // but try one-by-one to get the allowed ones at least
- final ArrayList<AccessibleObject> ret = new ArrayList<AccessibleObject>(aoa.length);
- for (final AccessibleObject ao : aoa) {
- try {
- ao.setAccessible(true);
- ret.add(ao);
- } catch (Throwable inner) {
- // swallow for strict security managers, module systems, android or others
- }
- }
- return ret.toArray((AccessibleObject[]) Array.newInstance(aoa.getClass().getComponentType(), ret.size()));
- }
- }
-
private final LazyReference<CachedMethod[]> methods = new LazyReference<CachedMethod[]>(softBundle) {
private static final long serialVersionUID = 6347586066597418308L;
public CachedMethod[] initValue() {
- final Method[] declaredMethods = (Method[])
- AccessController.doPrivileged(new PrivilegedAction/*<Method[]>*/() {
- public /*Method[]*/ Object run() {
+ final Method[] declaredMethods =
+ AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
+ public Method[] run() {
try {
Method[] dm = getTheClass().getDeclaredMethods();
- dm = (Method[]) makeAccessible(dm);
+ dm = Arrays.stream(dm)
+ .filter(m -> checkCanSetAccessible(m, CachedClass.class))
+ .toArray(Method[]::new);
+// dm = (Method[]) ReflectionUtils.makeAccessible(dm);
return dm;
} catch (Throwable e) {
// Typically, Android can throw ClassNotFoundException
@@ -151,7 +137,7 @@ public class CachedClass {
else
methods.add(cachedMethod);
}
- CachedMethod [] resMethods = methods.toArray(new CachedMethod[methods.size()]);
+ CachedMethod[] resMethods = methods.toArray(CachedMethod.EMPTY_ARRAY);
Arrays.sort(resMethods);
final CachedClass superClass = getCachedSuperClass();
@@ -221,7 +207,7 @@ public class CachedClass {
int hashCode;
- public CachedMethod [] mopMethods;
+ public CachedMethod[] mopMethods;
public static final CachedClass[] EMPTY_ARRAY = new CachedClass[0];
private final LazyReference<Set<CachedClass>> declaredInterfaces = new LazyReference<Set<CachedClass>> (softBundle) {
diff --git a/src/main/org/codehaus/groovy/reflection/CachedConstructor.java b/src/main/org/codehaus/groovy/reflection/CachedConstructor.java
index 74d9b713a0..fc04281332 100644
--- a/src/main/org/codehaus/groovy/reflection/CachedConstructor.java
+++ b/src/main/org/codehaus/groovy/reflection/CachedConstructor.java
@@ -24,34 +24,19 @@ import org.codehaus.groovy.runtime.InvokerInvocationException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
+
+import static org.codehaus.groovy.reflection.ReflectionUtils.makeAccessibleInPrivilegedAction;
/**
* @author Alex.Tkachman
*/
public class CachedConstructor extends ParameterTypes {
- CachedClass clazz;
-
- public final Constructor cachedConstructor;
+ private final CachedClass clazz;
+ private final Constructor cachedConstructor;
public CachedConstructor(CachedClass clazz, final Constructor c) {
this.cachedConstructor = c;
this.clazz = clazz;
- try {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- c.setAccessible(true);
- return null;
- }
- });
- } catch (SecurityException e) {
- // IGNORE
- } catch (RuntimeException re) {
- // test for JDK9 JIGSAW
- if (!"java.lang.reflect.InaccessibleObjectException".equals(re.getClass().getName())) throw re;
- // else IGNORE
- }
}
public CachedConstructor(Constructor c) {
@@ -78,6 +63,8 @@ public class CachedConstructor extends ParameterTypes {
}
public Object invoke(Object[] argumentArray) {
+ makeAccessibleIfNecessary();
+
Constructor constr = cachedConstructor;
try {
return constr.newInstance(argumentArray);
@@ -113,4 +100,22 @@ public class CachedConstructor extends ParameterTypes {
public CachedClass getCachedClass() {
return clazz;
}
+
+ public Class getDeclaringClass() {
+ return cachedConstructor.getDeclaringClass();
+ }
+
+ public Constructor getCachedConstructor() {
+ makeAccessibleIfNecessary();
+ AccessPermissionChecker.checkAccessPermission(cachedConstructor);
+ return cachedConstructor;
+ }
+
+ private boolean makeAccessibleDone = false;
+ private void makeAccessibleIfNecessary() {
+ if (!makeAccessibleDone) {
+ makeAccessibleInPrivilegedAction(cachedConstructor);
+ makeAccessibleDone = true;
+ }
+ }
}
diff --git a/src/main/org/codehaus/groovy/reflection/CachedField.java b/src/main/org/codehaus/groovy/reflection/CachedField.java
index 543a373653..c2b5dd4c10 100644
--- a/src/main/org/codehaus/groovy/reflection/CachedField.java
+++ b/src/main/org/codehaus/groovy/reflection/CachedField.java
@@ -25,12 +25,14 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import static org.codehaus.groovy.reflection.ReflectionUtils.makeAccessibleInPrivilegedAction;
+
public class CachedField extends MetaProperty {
- public final Field field;
+ private final Field cachedField;
public CachedField(Field field) {
super (field.getName(), field.getType());
- this.field = field;
+ this.cachedField = field;
}
public boolean isStatic() {
@@ -42,7 +44,7 @@ public class CachedField extends MetaProperty {
}
public int getModifiers() {
- return field.getModifiers();
+ return cachedField.getModifiers();
}
/**
@@ -50,8 +52,10 @@ public class CachedField extends MetaProperty {
* @throws RuntimeException if the property could not be evaluated
*/
public Object getProperty(final Object object) {
+ makeAccessibleIfNecessary();
+ AccessPermissionChecker.checkAccessPermission(cachedField);
try {
- return field.get(object);
+ return cachedField.get(object);
} catch (IllegalAccessException e) {
throw new GroovyRuntimeException("Cannot get the property '" + name + "'.", e);
}
@@ -65,15 +69,35 @@ public class CachedField extends MetaProperty {
* @throws RuntimeException if the property could not be set
*/
public void setProperty(final Object object, Object newValue) {
- final Object goalValue = DefaultTypeTransformation.castToType(newValue, field.getType());
+ makeAccessibleIfNecessary();
+ AccessPermissionChecker.checkAccessPermission(cachedField);
+ final Object goalValue = DefaultTypeTransformation.castToType(newValue, cachedField.getType());
if (isFinal()) {
throw new GroovyRuntimeException("Cannot set the property '" + name + "' because the backing field is final.");
}
try {
- field.set(object, goalValue);
+ cachedField.set(object, goalValue);
} catch (IllegalAccessException ex) {
throw new GroovyRuntimeException("Cannot set the property '" + name + "'.", ex);
}
}
+
+ public Class getDeclaringClass() {
+ return cachedField.getDeclaringClass();
+ }
+
+ public Field getCachedField() {
+ makeAccessibleIfNecessary();
+ AccessPermissionChecker.checkAccessPermission(cachedField);
+ return cachedField;
+ }
+
+ private boolean makeAccessibleDone = false;
+ private void makeAccessibleIfNecessary() {
+ if (!makeAccessibleDone) {
+ makeAccessibleInPrivilegedAction(cachedField);
+ makeAccessibleDone = true;
+ }
+ }
}
diff --git a/src/main/org/codehaus/groovy/reflection/CachedMethod.java b/src/main/org/codehaus/groovy/reflection/CachedMethod.java
index 0c8dac0489..b9e319c787 100644
--- a/src/main/org/codehaus/groovy/reflection/CachedMethod.java
+++ b/src/main/org/codehaus/groovy/reflection/CachedMethod.java
@@ -31,6 +31,7 @@ import org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite;
import org.codehaus.groovy.runtime.metaclass.MethodHelper;
import java.io.Serializable;
+import java.lang.annotation.Annotation;
import java.lang.ref.SoftReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -38,16 +39,16 @@ import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;
-/**
- * @author Alex.Tkachman
- */
+import static org.codehaus.groovy.reflection.ReflectionUtils.makeAccessibleInPrivilegedAction;
+
public class CachedMethod extends MetaMethod implements Comparable {
+ public static final CachedMethod[] EMPTY_ARRAY = new CachedMethod[0];
public final CachedClass cachedClass;
private final Method cachedMethod;
private int hashCode;
- private static MyComparator comparator = new MyComparator();
+ private static final MyComparator COMPARATOR = new MyComparator();
private SoftReference<Constructor> pogoCallSiteConstructor, pojoCallSiteConstructor, staticCallSiteConstructor;
@@ -70,14 +71,14 @@ public class CachedMethod extends MetaMethod implements Comparable {
// return cachedMethod;
// }
// return null;
- int i = Arrays.binarySearch(methods, method, comparator);
+ int i = Arrays.binarySearch(methods, method, COMPARATOR);
if (i < 0)
return null;
return methods[i];
}
- protected Class[] getPT() {
+ public Class[] getPT() {
return cachedMethod.getParameterTypes();
}
@@ -94,11 +95,33 @@ public class CachedMethod extends MetaMethod implements Comparable {
}
public final Object invoke(Object object, Object[] arguments) {
+ /*
+ CachedMethod transformedCachedMethod =
+ (CachedMethod) CallSiteHelper.transformMetaMethod(
+ InvokerHelper.getMetaClass(object.getClass()),
+ this,
+ this.getPT(),
+ CachedMethod.class);
+
+ Method cachedMethod = transformedCachedMethod.cachedMethod;
+
+ if (transformedCachedMethod == this) {
+ makeAccessibleIfNecessary();
+ } else {
+ ReflectionUtils.trySetAccessible(cachedMethod);
+ }
+ */
+
+ makeAccessibleIfNecessary();
+
+ try {
+ AccessPermissionChecker.checkAccessPermission(cachedMethod);
+ } catch (CacheAccessControlException ex) {
+ throw new InvokerInvocationException(ex);
+ }
try {
return cachedMethod.invoke(object, arguments);
- } catch (IllegalArgumentException e) {
- throw new InvokerInvocationException(e);
- } catch (IllegalAccessException e) {
+ } catch (IllegalArgumentException | IllegalAccessException e) {
throw new InvokerInvocationException(e);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
@@ -129,6 +152,9 @@ public class CachedMethod extends MetaMethod implements Comparable {
}
public final Method setAccessible() {
+ makeAccessibleIfNecessary();
+
+ AccessPermissionChecker.checkAccessPermission(cachedMethod);
// if (queuedToCompile.compareAndSet(false,true)) {
// if (isCompilable())
// CompileThread.addMethod(this);
@@ -330,9 +356,25 @@ public class CachedMethod extends MetaMethod implements Comparable {
}
}
+ public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
+ return cachedMethod.getAnnotation(annotationClass);
+ }
+
+ public boolean isSynthetic() {
+ return cachedMethod.isSynthetic();
+ }
+
public Method getCachedMethod() {
+ makeAccessibleIfNecessary();
+ AccessPermissionChecker.checkAccessPermission(cachedMethod);
return cachedMethod;
}
+ private boolean makeAccessibleDone = false;
+ private void makeAccessibleIfNecessary() {
+ if (!makeAccessibleDone) {
+ makeAccessibleInPrivilegedAction(cachedMethod);
+ makeAccessibleDone = true;
+ }
+ }
}
-
diff --git a/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java b/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
index ba24a6d39c..f8f0dfa6f2 100644
--- a/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
+++ b/src/main/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
@@ -60,12 +60,16 @@ public class ClassLoaderForClassArtifacts extends ClassLoader {
}
public String createClassName(Method method) {
+ return createClassName(method.getName());
+ }
+
+ public String createClassName(String methodName) {
final String name;
final String clsName = klazz.get().getName();
if (clsName.startsWith("java."))
- name = clsName.replace('.','_') + "$" + method.getName();
+ name = clsName.replace('.','_') + "$" + methodName;
else
- name = clsName + "$" + method.getName();
+ name = clsName + "$" + methodName;
int suffix = classNamesCounter.getAndIncrement();
return suffix == -1? name : name + "$" + suffix;
}
diff --git a/src/main/org/codehaus/groovy/reflection/MixinInMetaClass.java b/src/main/org/codehaus/groovy/reflection/MixinInMetaClass.java
index 2f58d5c529..1a592e685d 100644
--- a/src/main/org/codehaus/groovy/reflection/MixinInMetaClass.java
+++ b/src/main/org/codehaus/groovy/reflection/MixinInMetaClass.java
@@ -25,6 +25,7 @@ import groovy.lang.GroovySystem;
import groovy.lang.MetaClass;
import groovy.lang.MetaMethod;
import groovy.lang.MetaProperty;
+import groovy.transform.Internal;
import org.codehaus.groovy.runtime.HandleMetaClass;
import org.codehaus.groovy.runtime.MetaClassHelper;
import org.codehaus.groovy.runtime.metaclass.MixedInMetaClass;
@@ -134,7 +135,7 @@ public class MixinInMetaClass extends ManagedConcurrentMap {
if (!Modifier.isPublic(mod))
continue;
- if (method instanceof CachedMethod && ((CachedMethod) method).getCachedMethod().isSynthetic())
+ if (method instanceof CachedMethod && ((CachedMethod) method).isSynthetic())
continue;
if (Modifier.isStatic(mod)) {
@@ -159,6 +160,10 @@ public class MixinInMetaClass extends ManagedConcurrentMap {
}
}
+ private static boolean hasAnnotation(CachedMethod method, Class<Internal> annotationClass) {
+ return method.getAnnotation(annotationClass) != null;
+ }
+
private static void staticMethod(final MetaClass self, List<MetaMethod> arr, final CachedMethod method) {
CachedClass[] paramTypes = method.getParameterTypes();
diff --git a/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java b/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
index e621729823..03706d4611 100644
--- a/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
+++ b/src/main/org/codehaus/groovy/reflection/ReflectionUtils.java
@@ -18,9 +18,21 @@
*/
package org.codehaus.groovy.reflection;
+import org.codehaus.groovy.classgen.asm.util.TypeUtil;
+import org.codehaus.groovy.vmplugin.VMPlugin;
+import org.codehaus.groovy.vmplugin.VMPluginFactory;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
import java.util.Set;
/**
@@ -29,9 +41,9 @@ import java.util.Set;
* groovy MOP are excluded from the level counting.
*/
public class ReflectionUtils {
-
// these are packages in the call stack that are only part of the groovy MOP
private static final Set<String> IGNORED_PACKAGES = new HashSet<String>();
+ private static final VMPlugin VM_PLUGIN = VMPluginFactory.getPlugin();
static {
//IGNORED_PACKAGES.add("java.lang.reflect");
@@ -41,6 +53,7 @@ public class ReflectionUtils {
IGNORED_PACKAGES.add("org.codehaus.groovy.runtime.metaclass");
IGNORED_PACKAGES.add("org.codehaus.groovy.runtime");
IGNORED_PACKAGES.add("sun.reflect");
+ IGNORED_PACKAGES.add("java.security");
IGNORED_PACKAGES.add("java.lang.invoke");
IGNORED_PACKAGES.add("org.codehaus.groovy.vmplugin.v7");
}
@@ -119,6 +132,85 @@ public class ReflectionUtils {
}
}
+ public static Optional<Method> getMethod(Class type, String name, Class<?>... parameterTypes) {
+ out:
+ for (Method m : type.getMethods()) {
+ if (!m.getName().equals(name)) {
+ continue;
+ }
+
+ Class<?>[] methodParameterTypes = m.getParameterTypes();
+ if (methodParameterTypes.length != parameterTypes.length) {
+ continue;
+ }
+
+ for (int i = 0, n = methodParameterTypes.length; i < n; i++) {
+ Class<?> parameterType = TypeUtil.autoboxType(parameterTypes[i]);
+ if (null == parameterType) {
+ continue out;
+ }
+
+ Class<?> methodParameterType = TypeUtil.autoboxType(methodParameterTypes[i]);
+ if (!methodParameterType.isAssignableFrom(parameterType)) {
+ continue out;
+ }
+ }
+
+ return Optional.of(m);
+ }
+
+ return Optional.empty();
+ }
+
+ public static boolean checkCanSetAccessible(AccessibleObject accessibleObject,
+ Class<?> caller) {
+ return VM_PLUGIN.checkCanSetAccessible(accessibleObject, caller);
+ }
+
+ public static boolean trySetAccessible(AccessibleObject ao) {
+ try {
+ return VM_PLUGIN.trySetAccessible(ao);
+ } catch (Throwable t) {
+ // swallow for strict security managers, module systems, android or others
+ }
+
+ return false;
+ }
+
+ public static Optional<AccessibleObject> makeAccessibleInPrivilegedAction(final AccessibleObject ao) {
+ return AccessController.doPrivileged(new PrivilegedAction<Optional<AccessibleObject>>() {
+ public Optional<AccessibleObject> run() {
+ return makeAccessible(ao);
+ }
+ });
+ }
+
+ // to be run in PrivilegedAction!
+ public static Optional<AccessibleObject> makeAccessible(final AccessibleObject ao) {
+ AccessibleObject[] result = makeAccessible(new AccessibleObject[] { ao });
+
+ return Optional.ofNullable(0 == result.length ? null : result[0]);
+ }
+
+ // to be run in PrivilegedAction!
+ public static AccessibleObject[] makeAccessible(final AccessibleObject[] aoa) {
+ try {
+ AccessibleObject.setAccessible(aoa, true);
+ return aoa;
+ } catch (Throwable outer) {
+ // swallow for strict security managers, module systems, android or others,
+ // but try one-by-one to get the allowed ones at least
+ final List<AccessibleObject> ret = new ArrayList<>(aoa.length);
+ for (final AccessibleObject ao : aoa) {
+ boolean accessible = trySetAccessible(ao);
+ if (accessible) {
+ ret.add(ao);
+ }
+ }
+ return ret.toArray((AccessibleObject[]) Array.newInstance(aoa.getClass().getComponentType(), 0));
+ }
+ }
+
private static boolean superClassShouldBeIgnored(Class sc) {
return ((sc != null) && (sc.getPackage() != null) && "org.codehaus.groovy.runtime.callsite".equals(sc.getPackage().getName()));
}
diff --git a/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index e3f747426b..d49f83689a 100644
--- a/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -59,6 +59,7 @@ import org.codehaus.groovy.classgen.Verifier;
import org.codehaus.groovy.reflection.ClassInfo;
import org.codehaus.groovy.reflection.MixinInMetaClass;
import org.codehaus.groovy.reflection.ReflectionCache;
+import org.codehaus.groovy.reflection.ReflectionUtils;
import org.codehaus.groovy.reflection.stdclasses.CachedSAMClass;
import org.codehaus.groovy.runtime.callsite.BooleanClosureWrapper;
import org.codehaus.groovy.runtime.callsite.BooleanReturningMethodInvoker;
@@ -386,9 +387,9 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
if (groovyObject && field.getName().equals("metaClass")) {
continue;
}
- AccessController.doPrivileged(new PrivilegedAction() {
+ AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
- field.setAccessible(true);
+ ReflectionUtils.trySetAccessible(field);
return null;
}
});
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteArray.java b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
index c2c2cf2572..acbb06fa24 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
@@ -29,10 +29,10 @@ import org.codehaus.groovy.runtime.InvokerHelper;
import java.security.AccessController;
import java.security.PrivilegedAction;
+
public final class CallSiteArray {
public final CallSite[] array;
-
- public static final Object [] NOPARAM = new Object[0];
+ public static final Object[] NOPARAM = new Object[0];
public final Class owner;
public CallSiteArray(Class owner, String [] names) {
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
index 8931d19599..1267cfe5b4 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -32,7 +32,6 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class CallSiteGenerator {
@@ -71,9 +70,8 @@ public class CallSiteGenerator {
BytecodeHelper.doCast(mv, callClass);
if (useInterface) invokeMethodCode = Opcodes.INVOKEINTERFACE;
}
-
- Method method = cachedMethod.setAccessible();
- Class<?>[] parameters = method.getParameterTypes();
+
+ Class<?>[] parameters = cachedMethod.getPT();
int size = parameters.length;
for (int i = 0; i < size; i++) {
if (useArray) {
@@ -231,7 +229,7 @@ public class CallSiteGenerator {
final CachedClass declClass = cachedMethod.getDeclaringClass();
final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
- final String name = callSiteLoader.createClassName(cachedMethod.setAccessible());
+ final String name = callSiteLoader.createClassName(cachedMethod.getName());
final byte[] bytes = genPogoMetaMethodSite(cachedMethod, cw, name);
@@ -243,7 +241,7 @@ public class CallSiteGenerator {
final CachedClass declClass = cachedMethod.getDeclaringClass();
final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
- final String name = callSiteLoader.createClassName(cachedMethod.setAccessible());
+ final String name = callSiteLoader.createClassName(cachedMethod.getName());
final byte[] bytes = genPojoMetaMethodSite(cachedMethod, cw, name);
@@ -255,7 +253,7 @@ public class CallSiteGenerator {
final CachedClass declClass = cachedMethod.getDeclaringClass();
final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
- final String name = callSiteLoader.createClassName(cachedMethod.setAccessible());
+ final String name = callSiteLoader.createClassName(cachedMethod.getName());
final byte[] bytes = genStaticMetaMethodSite(cachedMethod, cw, name);
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
new file mode 100644
index 0000000000..016c5373d0
--- /dev/null
+++ b/src/main/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.runtime.callsite;
+
+import groovy.lang.MetaClass;
+import groovy.lang.MetaMethod;
+import org.codehaus.groovy.vmplugin.VMPlugin;
+import org.codehaus.groovy.vmplugin.VMPluginFactory;
+
+public class CallSiteHelper {
+ private static final VMPlugin VM_PLUGIN = VMPluginFactory.getPlugin();
+
+ public static MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
+ return VM_PLUGIN.transformMetaMethod(metaClass, metaMethod, params, caller);
+ }
+
+}
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java b/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
index e8d7816683..efa5fb5c26 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
@@ -33,7 +33,7 @@ public class GetEffectivePogoFieldSite extends AbstractCallSite {
public GetEffectivePogoFieldSite(CallSite site, MetaClass metaClass, CachedField effective) {
super(site);
this.metaClass = metaClass;
- this.effective = effective.field;
+ this.effective = effective.getCachedField();
}
public final Object callGetProperty (Object receiver) throws Throwable {
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java b/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
index 68f7342e4c..f1c4d719f9 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
@@ -33,7 +33,7 @@ class GetEffectivePojoFieldSite extends AbstractCallSite {
public GetEffectivePojoFieldSite(CallSite site, MetaClassImpl metaClass, CachedField effective) {
super(site);
this.metaClass = metaClass;
- this.effective = effective.field;
+ this.effective = effective.getCachedField();
version = metaClass.getVersion();
}
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java b/src/main/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
index dc151450e6..94fb39324a 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
@@ -28,7 +28,7 @@ import groovy.lang.MetaMethod;
*/
public abstract class MetaMethodSite extends MetaClassSite {
final MetaMethod metaMethod;
- protected final Class [] params;
+ protected final Class[] params;
public MetaMethodSite(CallSite site, MetaClass metaClass, MetaMethod metaMethod, Class[] params) {
super(site, metaClass);
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java b/src/main/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
index 243e62de31..0a69ab4172 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
@@ -160,6 +160,9 @@ public class PogoMetaMethodSite extends MetaMethodSite {
public PogoCachedMethodSite(CallSite site, MetaClassImpl metaClass, CachedMethod metaMethod, Class[] params) {
super(site, metaClass, metaMethod, params);
reflect = metaMethod.setAccessible();
+
+// super(site, metaClass, CallSiteHelper.transformMetaMethod(metaClass, metaMethod, params, site), params);
+// reflect = ((CachedMethod) super.metaMethod).setAccessible();
}
public Object invoke(Object receiver, Object[] args) throws Throwable {
diff --git a/src/main/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java b/src/main/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
index 7bbd903d00..d44b0a507f 100644
--- a/src/main/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
+++ b/src/main/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
@@ -181,8 +181,8 @@ public class PojoMetaMethodSite extends MetaMethodSite {
final Method reflect;
public PojoCachedMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
- super(site, metaClass, metaMethod, params);
- reflect = ((CachedMethod)metaMethod).setAccessible();
+ super(site, metaClass, CallSiteHelper.transformMetaMethod(metaClass, metaMethod, params, site.getArray().owner), params);
+ reflect = ((CachedMethod) super.metaMethod).setAccessible();
}
public Object invoke(Object receiver, Object[] args) throws Throwable {
diff --git a/src/main/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java b/src/main/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
index 742060b2eb..97c0580637 100644
--- a/src/main/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
+++ b/src/main/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
@@ -234,7 +234,7 @@ public class MetaClassRegistryImpl implements MetaClassRegistry{
for (CachedMethod method : methods) {
final int mod = method.getModifiers();
- if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && method.getCachedMethod().getAnnotation(Deprecated.class) == null) {
+ if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && method.getAnnotation(Deprecated.class) == null) {
CachedClass[] paramTypes = method.getParameterTypes();
if (paramTypes.length > 0) {
List<MetaMethod> arr = map.get(paramTypes[0]);
diff --git a/src/main/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java b/src/main/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
index 4f0cc4cb96..5e30927362 100644
--- a/src/main/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
+++ b/src/main/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
@@ -32,12 +32,11 @@ import java.lang.reflect.Modifier;
* <p>
* <b>Note:</b> This exception as for internal use only!
*
- * @author Jochen Theodorou
* @since Groovy 1.1
*/
public class MethodSelectionException extends GroovyRuntimeException {
- private static final long serialVersionUID = 6260193948973669540L;
+ private static final long serialVersionUID = 8126246630023758333L;
private final String methodName;
private final FastArray methods;
private final Class[] arguments;
@@ -92,12 +91,12 @@ public class MethodSelectionException extends GroovyRuntimeException {
appendClassNames(buffer,method.getNativeParameterTypes());
}
else {
- CachedConstructor method = (CachedConstructor) methodOrConstructor;
- buffer.append(Modifier.toString(method.cachedConstructor.getModifiers()));
- buffer.append(" ").append(method.cachedConstructor.getDeclaringClass().getName());
+ CachedConstructor constructor = (CachedConstructor) methodOrConstructor;
+ buffer.append(Modifier.toString(constructor.getModifiers()));
+ buffer.append(" ").append(constructor.getDeclaringClass().getName());
buffer.append("#<init>");
- appendClassNames(buffer,method.getNativeParameterTypes());
+ appendClassNames(buffer,constructor.getNativeParameterTypes());
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/org/codehaus/groovy/tools/DgmConverter.java b/src/main/org/codehaus/groovy/tools/DgmConverter.java
index 0965c92ac4..93997a1058 100644
--- a/src/main/org/codehaus/groovy/tools/DgmConverter.java
+++ b/src/main/org/codehaus/groovy/tools/DgmConverter.java
@@ -58,7 +58,7 @@ public class DgmConverter implements Opcodes {
if (!method.isStatic() || !method.isPublic())
continue;
- if (method.getCachedMethod().getAnnotation(Deprecated.class) != null)
+ if (method.getAnnotation(Deprecated.class) != null)
continue;
if (method.getParameterTypes().length == 0)
diff --git a/src/main/org/codehaus/groovy/vmplugin/VMPlugin.java b/src/main/org/codehaus/groovy/vmplugin/VMPlugin.java
index d89ec16ce8..0d72662e77 100644
--- a/src/main/org/codehaus/groovy/vmplugin/VMPlugin.java
+++ b/src/main/org/codehaus/groovy/vmplugin/VMPlugin.java
@@ -18,22 +18,24 @@
*/
package org.codehaus.groovy.vmplugin;
+import groovy.lang.MetaClass;
+import groovy.lang.MetaMethod;
import org.codehaus.groovy.ast.AnnotationNode;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.CompileUnit;
+import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
/**
* Interface to access VM version based actions.
* This interface is for internal use only!
- *
- * @author Jochen Theodorou
*/
public interface VMPlugin {
void setAdditionalClassInformation(ClassNode c);
Class[] getPluginDefaultGroovyMethods();
Class[] getPluginStaticGroovyMethods();
+ void configureAnnotationNodeFromDefinition(AnnotationNode definition, AnnotationNode root);
void configureAnnotation(AnnotationNode an);
void configureClassNode(CompileUnit compileUnit, ClassNode classNode);
void invalidateCallSites();
@@ -56,9 +58,39 @@ public interface VMPlugin {
Object invokeHandle(Object handle, Object[] args) throws Throwable;
/**
- * Gives the version the plguin is made for
- * @return 5 for jdk5, 6 for jdk6, 7 for jdk7 or higher
+ * Gives the version the plugin is made for
+ * @return 7 for jdk7, 8 for jdk8, 9 for jdk9 or higher
*/
int getVersion();
+ /**
+ * Check whether invoking {@link AccessibleObject#setAccessible(boolean)} on the accessible object will be completed successfully
+ *
+ * @param accessibleObject the accessible object to check
+ * @param caller the caller to invoke {@code setAccessible}
+ * @return the check result
+ */
+ boolean checkCanSetAccessible(AccessibleObject accessibleObject, Class<?> caller);
+
+ /**
+ * Set the {@code accessible} flag for this reflected object to {@code true}
+ * if possible.
+ *
+ * @param ao the accessible object
+ * @return {@code true} if the {@code accessible} flag is set to {@code true};
+ * {@code false} if access cannot be enabled.
+ * @throws SecurityException if the request is denied by the security manager
+ */
+ boolean trySetAccessible(AccessibleObject ao);
+
+ /**
+ * transform meta method
+ *
+ * @param metaClass meta class
+ * @param metaMethod the original meta method
+ * @param params parameter types
+ * @param caller caller type
+ * @return the transformed meta method
+ */
+ MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller);
}
diff --git a/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java b/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
index 86c34b22af..a79eef0a13 100644
--- a/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
+++ b/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
@@ -18,6 +18,8 @@
*/
package org.codehaus.groovy.vmplugin.v5;
+import groovy.lang.MetaClass;
+import groovy.lang.MetaMethod;
import org.codehaus.groovy.GroovyBugError;
import org.codehaus.groovy.ast.AnnotatedNode;
import org.codehaus.groovy.ast.AnnotationNode;
@@ -36,12 +38,14 @@ import org.codehaus.groovy.ast.expr.ListExpression;
import org.codehaus.groovy.ast.expr.PropertyExpression;
import org.codehaus.groovy.ast.stmt.ReturnStatement;
import org.codehaus.groovy.vmplugin.VMPlugin;
+import org.codehaus.groovy.vmplugin.VMPluginFactory;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -50,19 +54,21 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.MalformedParameterizedTypeException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.ReflectPermission;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
+import java.security.Permission;
import java.util.List;
/**
* java 5 based functions
- *
- * @author Jochen Theodorou
*/
public class Java5 implements VMPlugin {
- private static Class[] EMPTY_CLASS_ARRAY = new Class[0];
+ private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
private static final Class[] PLUGIN_DGM = {PluginDefaultGroovyMethods.class};
+ private static final Method[] EMPTY_METHOD_ARRAY = new Method[0];
+ private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
public void setAdditionalClassInformation(ClassNode cn) {
setGenericsTypes(cn);
@@ -84,15 +90,16 @@ public class Java5 implements VMPlugin {
}
private GenericsType configureTypeVariableDefinition(TypeVariable tv) {
- ClassNode base = configureTypeVariableReference(tv);
+ return configureTypeVariableDefinition(configureTypeVariableReference(tv.getName()), configureTypes(tv.getBounds()));
+ }
+
+ public static GenericsType configureTypeVariableDefinition(ClassNode base, ClassNode[] cBounds) {
ClassNode redirect = base.redirect();
base.setRedirect(null);
- Type[] tBounds = tv.getBounds();
GenericsType gt;
- if (tBounds.length == 0) {
+ if (cBounds == null || cBounds.length == 0) {
gt = new GenericsType(base);
} else {
- ClassNode[] cBounds = configureTypes(tBounds);
gt = new GenericsType(base, cBounds, null);
gt.setName(base.getName());
gt.setPlaceholder(true);
@@ -118,7 +125,7 @@ public class Java5 implements VMPlugin {
} else if (type instanceof GenericArrayType) {
return configureGenericArray((GenericArrayType) type);
} else if (type instanceof TypeVariable) {
- return configureTypeVariableReference((TypeVariable) type);
+ return configureTypeVariableReference(((TypeVariable) type).getName());
} else if (type instanceof Class) {
return configureClass((Class) type);
} else if (type==null) {
@@ -168,10 +175,10 @@ public class Java5 implements VMPlugin {
return base;
}
- private ClassNode configureTypeVariableReference(TypeVariable tv) {
- ClassNode cn = ClassHelper.makeWithoutCaching(tv.getName());
+ public static ClassNode configureTypeVariableReference(String name) {
+ ClassNode cn = ClassHelper.makeWithoutCaching(name);
cn.setGenericsPlaceHolder(true);
- ClassNode cn2 = ClassHelper.makeWithoutCaching(tv.getName());
+ ClassNode cn2 = ClassHelper.makeWithoutCaching(name);
cn2.setGenericsPlaceHolder(true);
GenericsType[] gts = new GenericsType[]{new GenericsType(cn2)};
cn.setGenericsTypes(gts);
@@ -210,18 +217,22 @@ public class Java5 implements VMPlugin {
}
}
- private void configureAnnotationFromDefinition(AnnotationNode definition, AnnotationNode root) {
+ @Deprecated
+ public void configureAnnotationFromDefinition(AnnotationNode definition, AnnotationNode root) {
+ VMPlugin plugin = VMPluginFactory.getPlugin();
+ plugin.configureAnnotationNodeFromDefinition(definition, root);
+ }
+
+ public void configureAnnotationNodeFromDefinition(AnnotationNode definition, AnnotationNode root) {
ClassNode type = definition.getClassNode();
- if (!type.isResolved()) return;
- Class clazz = type.getTypeClass();
- if (clazz == Retention.class) {
+ if ("java.lang.annotation.Retention".equals(type.getName())) {
Expression exp = definition.getMember("value");
if (!(exp instanceof PropertyExpression)) return;
PropertyExpression pe = (PropertyExpression) exp;
String name = pe.getPropertyAsString();
RetentionPolicy policy = RetentionPolicy.valueOf(name);
setRetentionPolicy(policy, root);
- } else if (clazz == Target.class) {
+ } else if ("java.lang.annotation.Target".equals(type.getName())) {
Expression exp = definition.getMember("value");
if (!(exp instanceof ListExpression)) return;
ListExpression le = (ListExpression) exp;
@@ -239,13 +250,12 @@ public class Java5 implements VMPlugin {
public void configureAnnotation(AnnotationNode node) {
ClassNode type = node.getClassNode();
+ VMPlugin plugin = VMPluginFactory.getPlugin();
List<AnnotationNode> annotations = type.getAnnotations();
for (AnnotationNode an : annotations) {
- configureAnnotationFromDefinition(an, node);
- }
- if (!"java.lang.annotation.Retention".equals(node.getClassNode().getName())) {
- configureAnnotationFromDefinition(node, node);
+ plugin.configureAnnotationNodeFromDefinition(an, node);
}
+ plugin.configureAnnotationNodeFromDefinition(node, node);
}
private void configureAnnotation(AnnotationNode node, Annotation annotation) {
@@ -271,7 +281,7 @@ public class Java5 implements VMPlugin {
try {
declaredMethods = type.getDeclaredMethods();
} catch (SecurityException se) {
- declaredMethods = new Method[0];
+ declaredMethods = EMPTY_METHOD_ARRAY;
}
for (Method declaredMethod : declaredMethods) {
try {
@@ -280,8 +290,7 @@ public class Java5 implements VMPlugin {
if (valueExpression == null)
continue;
node.setMember(declaredMethod.getName(), valueExpression);
- } catch (IllegalAccessException e) {
- } catch (InvocationTargetException e) {
+ } catch (IllegalAccessException | InvocationTargetException e) {
}
}
}
@@ -305,7 +314,7 @@ public class Java5 implements VMPlugin {
return null;
}
- private void setRetentionPolicy(RetentionPolicy value, AnnotationNode node) {
+ private static void setRetentionPolicy(RetentionPolicy value, AnnotationNode node) {
switch (value) {
case RUNTIME:
node.setRuntimeRetention(true);
@@ -321,7 +330,7 @@ public class Java5 implements VMPlugin {
}
}
- private int getElementCode(ElementType value) {
+ protected int getElementCode(ElementType value) {
switch (value) {
case TYPE:
return AnnotationNode.TYPE_TARGET;
@@ -339,13 +348,11 @@ public class Java5 implements VMPlugin {
return AnnotationNode.ANNOTATION_TARGET;
case PACKAGE:
return AnnotationNode.PACKAGE_TARGET;
- default:
- if ("TYPE_USE".equals(value.name()) || "TYPE_PARAMETER".equals(value.name()) || "MODULE".equals(value.name())) {
- // return 0 value because we are binary or'ing this and want to ignore without failing
- // later version plugins will override and provide sensible values for jdk8+
- return 0;
- }
- throw new GroovyBugError("unsupported Target " + value);
+ }
+ if ("MODULE".equals(value.name())) {
+ return AnnotationNode.TYPE_TARGET;
+ } else {
+ throw new GroovyBugError("unsupported Target " + value);
}
}
@@ -370,7 +377,7 @@ public class Java5 implements VMPlugin {
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
ClassNode ret = makeClassNode(compileUnit, m.getGenericReturnType(), m.getReturnType());
- Parameter[] params = makeParameters(compileUnit, m.getGenericParameterTypes(), m.getParameterTypes(), m.getParameterAnnotations());
+ Parameter[] params = processParameters(compileUnit, m);
ClassNode[] exceptions = makeClassNodes(compileUnit, m.getGenericExceptionTypes(), m.getExceptionTypes());
MethodNode mn = new MethodNode(m.getName(), m.getModifiers(), ret, params, exceptions, null);
mn.setSynthetic(m.isSynthetic());
@@ -381,12 +388,15 @@ public class Java5 implements VMPlugin {
}
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor ctor : constructors) {
- Parameter[] params = makeParameters(
- compileUnit,
- ctor.getGenericParameterTypes(),
- ctor.getParameterTypes(),
- getConstructorParameterAnnotations(ctor)
- );
+ Type[] types = ctor.getGenericParameterTypes();
+ Parameter[] params1 = Parameter.EMPTY_ARRAY;
+ if (types.length > 0) {
+ params1 = new Parameter[types.length];
+ for (int i = 0; i < params1.length; i++) {
+ params1[i] = makeParameter(compileUnit, types[i], ctor.getParameterTypes()[i], getConstructorParameterAnnotations(ctor)[i], "param" + i);
+ }
+ }
+ Parameter[] params = params1;
ClassNode[] exceptions = makeClassNodes(compileUnit, ctor.getGenericExceptionTypes(), ctor.getExceptionTypes());
classNode.addConstructor(ctor.getModifiers(), params, exceptions, null);
}
@@ -407,6 +417,18 @@ public class Java5 implements VMPlugin {
}
}
+ protected Parameter[] processParameters(CompileUnit compileUnit, Method m) {
+ Type[] types = m.getGenericParameterTypes();
+ Parameter[] params = Parameter.EMPTY_ARRAY;
+ if (types.length > 0) {
+ params = new Parameter[types.length];
+ for (int i = 0; i < params.length; i++) {
+ params[i] = makeParameter(compileUnit, types[i], m.getParameterTypes()[i], m.getParameterAnnotations()[i], "param" + i);
+ }
+ }
+ return params;
+ }
+
/**
* Synthetic parameters such as those added for inner class constructors may
* not be included in the parameter annotations array. This is the case when
@@ -444,7 +466,7 @@ public class Java5 implements VMPlugin {
}
Annotation[][] adjusted = new Annotation[parameterCount][];
for (int i = 0; i < diff; i++) {
- adjusted[i] = new Annotation[0];
+ adjusted[i] = EMPTY_ANNOTATION_ARRAY;
}
System.arraycopy(annotations, 0, adjusted, diff, annotations.length);
return adjusted;
@@ -495,20 +517,9 @@ public class Java5 implements VMPlugin {
return back.getPlainNodeReference();
}
- private Parameter[] makeParameters(CompileUnit cu, Type[] types, Class[] cls, Annotation[][] parameterAnnotations) {
- Parameter[] params = Parameter.EMPTY_ARRAY;
- if (types.length > 0) {
- params = new Parameter[types.length];
- for (int i = 0; i < params.length; i++) {
- params[i] = makeParameter(cu, types[i], cls[i], parameterAnnotations[i], i);
- }
- }
- return params;
- }
-
- private Parameter makeParameter(CompileUnit cu, Type type, Class cl, Annotation[] annotations, int idx) {
+ protected Parameter makeParameter(CompileUnit cu, Type type, Class cl, Annotation[] annotations, String name) {
ClassNode cn = makeClassNode(cu, type, cl);
- Parameter parameter = new Parameter(cn, "param" + idx);
+ Parameter parameter = new Parameter(cn, name);
setAnnotationMetaData(annotations, parameter);
return parameter;
}
@@ -529,5 +540,55 @@ public class Java5 implements VMPlugin {
public Object invokeHandle(Object handle, Object[] args) throws Throwable {
throw new GroovyBugError("invokeHandle requires at least JDK 7");
}
+
+ /**
+ * The following scenarios can not set accessible, i.e. the return value is false
+ * 1) SecurityException occurred
+ * 2) the accessible object is a Constructor object for the Class class
+ *
+ * @param accessibleObject the accessible object to check
+ * @param caller the caller to invoke {@code setAccessible}
+ * @return the check result
+ */
+ @Override
+ public boolean checkCanSetAccessible(AccessibleObject accessibleObject,
+ Class<?> caller) {
+ SecurityManager sm = System.getSecurityManager();
+ try {
+ if (sm != null) {
+ sm.checkPermission(ACCESS_PERMISSION);
+ }
+ } catch (SecurityException e) {
+ return false;
+ }
+
+ if (accessibleObject instanceof Constructor) {
+ Constructor c = (Constructor) accessibleObject;
+ if (c.getDeclaringClass() == Class.class) {
+ return false; // Cannot make a java.lang.Class constructor accessible
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean trySetAccessible(AccessibleObject ao) {
+ try {
+ ao.setAccessible(true);
+ return true;
+ } catch (SecurityException e) {
+ throw e;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ @Override
+ public MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
+ return metaMethod;
+ }
+
+ private static final Permission ACCESS_PERMISSION = new ReflectPermission("suppressAccessChecks");
}
diff --git a/src/main/org/codehaus/groovy/vmplugin/v7/Java7.java b/src/main/org/codehaus/groovy/vmplugin/v7/Java7.java
index 93165b1d6e..dbcd111446 100644
--- a/src/main/org/codehaus/groovy/vmplugin/v7/Java7.java
+++ b/src/main/org/codehaus/groovy/vmplugin/v7/Java7.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.vmplugin.v7;
import org.codehaus.groovy.GroovyBugError;
+import org.codehaus.groovy.reflection.ReflectionUtils;
import org.codehaus.groovy.vmplugin.v6.Java6;
import java.lang.invoke.MethodHandle;
@@ -29,40 +30,44 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
/**
- * Java 7 based functions. Currently just a stub but you can
- * add your own methods to your own version and place it on the classpath
- * ahead of this one.
+ * Java 7 based functions.
*
- * @author Jochen Theodorou
+ * For crude customization, you can add your own methods to your own version and place it on the classpath ahead of this one.
*/
public class Java7 extends Java6 {
- private static final Constructor<MethodHandles.Lookup> LOOKUP_Constructor;
- static {
- Constructor<MethodHandles.Lookup> con = null;
- try {
- con = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
- } catch (NoSuchMethodException e) {
- throw new GroovyBugError(e);
- }
- try {
- if (!con.isAccessible()) {
- final Constructor tmp = con;
- AccessController.doPrivileged(new PrivilegedAction() {
- @Override
- public Object run() {
- tmp.setAccessible(true);
- return null;
- }
- });
+ private static class LookupHolder {
+ private static final Constructor<MethodHandles.Lookup> LOOKUP_Constructor;
+ static {
+ Constructor<MethodHandles.Lookup> con = null;
+ try {
+ con = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
+ } catch (NoSuchMethodException e) {
+ throw new GroovyBugError(e);
}
- } catch (SecurityException se) {
- con = null;
- } catch (RuntimeException re) {
- // test for JDK9 JIGSAW
- if (!"java.lang.reflect.InaccessibleObjectException".equals(re.getClass().getName())) throw re;
- con = null;
+ try {
+ if (!con.isAccessible()) {
+ final Constructor tmp = con;
+ AccessController.doPrivileged(new PrivilegedAction<Object>() {
+ @Override
+ public Object run() {
+ ReflectionUtils.trySetAccessible(tmp);
+ return null;
+ }
+ });
+ }
+ } catch (SecurityException se) {
+ con = null;
+ } catch (RuntimeException re) {
+ // test for JDK9 JIGSAW
+ if (!"java.lang.reflect.InaccessibleObjectException".equals(re.getClass().getName())) throw re;
+ con = null;
+ }
+ LOOKUP_Constructor = con;
}
- LOOKUP_Constructor = con;
+ }
+
+ private static Constructor<MethodHandles.Lookup> getLookupConstructor() {
+ return LookupHolder.LOOKUP_Constructor;
}
@Override
@@ -77,22 +82,21 @@ public class Java7 extends Java6 {
@Override
public Object getInvokeSpecialHandle(final Method method, final Object receiver) {
- if (LOOKUP_Constructor==null) {
+ if (getLookupConstructor() == null) {
return super.getInvokeSpecialHandle(method, receiver);
}
if (!method.isAccessible()) {
- AccessController.doPrivileged(new PrivilegedAction() {
+ AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
- method.setAccessible(true);
+ ReflectionUtils.trySetAccessible(method);
return null;
}
});
}
Class declaringClass = method.getDeclaringClass();
try {
- return LOOKUP_Constructor.
- newInstance(declaringClass, MethodHandles.Lookup.PRIVATE).
+ return getLookupConstructor().newInstance(declaringClass, -1).
unreflectSpecial(method, declaringClass).
bindTo(receiver);
} catch (ReflectiveOperationException e) {
diff --git a/src/main/org/codehaus/groovy/vmplugin/v7/Selector.java b/src/main/org/codehaus/groovy/vmplugin/v7/Selector.java
index a8f9b464e9..c0e9ca37cc 100644
--- a/src/main/org/codehaus/groovy/vmplugin/v7/Selector.java
+++ b/src/main/org/codehaus/groovy/vmplugin/v7/Selector.java
@@ -325,7 +325,7 @@ public abstract class Selector {
insertName = true;
} else if (res instanceof CachedField) {
CachedField cf = (CachedField) res;
- Field f = cf.field;
+ Field f = cf.getCachedField();
try {
handle = LOOKUP.unreflectGetter(f);
if (Modifier.isStatic(f.getModifiers())) {
@@ -424,7 +424,7 @@ public abstract class Selector {
if (LOG_ENABLED) LOG.info("meta method is MetaConstructor instance");
MetaConstructor mc = (MetaConstructor) method;
isVargs = mc.isVargsMethod();
- Constructor con = mc.getCachedConstrcutor().cachedConstructor;
+ Constructor con = mc.getCachedConstrcutor().getCachedConstructor();
try {
handle = LOOKUP.unreflectConstructor(con);
if (LOG_ENABLED) LOG.info("successfully unreflected constructor");
diff --git a/src/main/org/codehaus/groovy/vmplugin/v9/Java9.java b/src/main/org/codehaus/groovy/vmplugin/v9/Java9.java
new file mode 100644
index 0000000000..eb3f760c1f
--- /dev/null
+++ b/src/main/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -0,0 +1,253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.vmplugin.v9;
+
+import groovy.lang.MetaClass;
+import groovy.lang.MetaMethod;
+import org.codehaus.groovy.GroovyBugError;
+import org.codehaus.groovy.reflection.CachedClass;
+import org.codehaus.groovy.reflection.CachedMethod;
+import org.codehaus.groovy.reflection.ReflectionUtils;
+import org.codehaus.groovy.vmplugin.v5.Java5;
+import org.codehaus.groovy.vmplugin.v8.Java8;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Optional;
+
+/**
+ * Additional Java 9 based functions will be added here as needed.
+ */
+public class Java9 extends Java8 {
+
+ private static class LookupHolder {
+ private static final Method PRIVATE_LOOKUP;
+ private static final Constructor<MethodHandles.Lookup> LOOKUP_Constructor;
+ static {
+ Constructor<MethodHandles.Lookup> lookup = null;
+ Method privateLookup = null;
+ try { // java 9
+ privateLookup = MethodHandles.class.getMethod("privateLookupIn", Class.class, MethodHandles.Lookup.class);
+ } catch (final NoSuchMethodException | RuntimeException e) { // java 8 or fallback if anything else goes wrong
+ try {
+ lookup = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, Integer.TYPE);
+ if (!lookup.isAccessible()) {
+ ReflectionUtils.trySetAccessible(lookup);
+ }
+ } catch (final NoSuchMethodException ex) {
+ throw new IllegalStateException("Incompatible JVM", e);
+ }
+ }
+ PRIVATE_LOOKUP = privateLookup;
+ LOOKUP_Constructor = lookup;
+ }
+ }
+
+ private static Constructor<MethodHandles.Lookup> getLookupConstructor() {
+ return LookupHolder.LOOKUP_Constructor;
+ }
+
+ private static Method getPrivateLookup() {
+ return LookupHolder.PRIVATE_LOOKUP;
+ }
+
+ public static MethodHandles.Lookup of(final Class<?> declaringClass) {
+ try {
+ if (getPrivateLookup() != null) {
+ return MethodHandles.Lookup.class.cast(getPrivateLookup().invoke(null, declaringClass, MethodHandles.lookup()));
+ }
+ return getLookupConstructor().newInstance(declaringClass, MethodHandles.Lookup.PRIVATE).in(declaringClass);
+ } catch (final IllegalAccessException | InstantiationException e) {
+ throw new IllegalArgumentException(e);
+ } catch (final InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public int getVersion() {
+ return 9;
+ }
+
+ @Override
+ public Object getInvokeSpecialHandle(Method method, Object receiver) {
+ if (getLookupConstructor() != null) {
+ Class declaringClass = method.getDeclaringClass();
+ try {
+ return of(declaringClass).unreflectSpecial(method, receiver.getClass()).bindTo(receiver);
+ } catch (ReflectiveOperationException e) {
+ throw new GroovyBugError(e);
+ }
+ }
+ return super.getInvokeSpecialHandle(method, receiver);
+ }
+
+ /**
+ * This method may be used by a caller in class C to check whether to enable access to a member of declaring class D successfully
+ * if {@link Java5#checkCanSetAccessible(java.lang.reflect.AccessibleObject, java.lang.Class)} returns true and any of the following hold:
+ *
+ * 1) C and D are in the same module.
+ * 2) The member is public and D is public in a package that the module containing D exports to at least the module containing C.
+ * 3) The member is protected static, D is public in a package that the module containing D exports to at least the module containing C, and C is a subclass of D.
+ * 4) D is in a package that the module containing D opens to at least the module containing C. All packages in unnamed and open modules are open to all modules and so this method always succeeds when D is in an unnamed or open module.
+ *
+ * @param accessibleObject the accessible object to check
+ * @param caller the caller to invoke {@code setAccessible}
+ * @return the check result
+ */
+ public boolean checkCanSetAccessible(AccessibleObject accessibleObject,
+ Class<?> caller) {
+
+ if (!super.checkCanSetAccessible(accessibleObject, caller)) return false;
+
+ if (caller == MethodHandle.class) {
+ throw new IllegalCallerException(); // should not happen
+ }
+
+ if (!(accessibleObject instanceof Member)) {
+ throw new IllegalArgumentException("accessibleObject should be a member of type: " + accessibleObject); // should not happen
+ }
+
+ Class<?> declaringClass = ((Member) accessibleObject).getDeclaringClass();
+
+ Module callerModule = caller.getModule();
+ Module declaringModule = declaringClass.getModule();
+
+ if (callerModule == declaringModule) return true;
+ if (callerModule == Object.class.getModule()) return true;
+ if (!declaringModule.isNamed()) return true;
+
+ int modifiers;
+ if (accessibleObject instanceof Executable) {
+ modifiers = ((Executable) accessibleObject).getModifiers();
+ } else {
+ modifiers = ((Field) accessibleObject).getModifiers();
+ }
+
+ return checkAccessible(caller, declaringClass, modifiers, true);
+ }
+
+
+ @Override
+ public boolean trySetAccessible(AccessibleObject ao) {
+ return ao.trySetAccessible();
+ }
+
+ @Override
+ public MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
+ if (!(metaMethod instanceof CachedMethod)) {
+ return metaMethod;
+ }
+
+ CachedMethod cachedMethod = (CachedMethod) metaMethod;
+ CachedClass methodDeclaringClass = cachedMethod.getDeclaringClass();
+
+ if (null == methodDeclaringClass) {
+ return metaMethod;
+ }
+
+ Class<?> declaringClass = methodDeclaringClass.getTheClass();
+ Class theClass = metaClass.getTheClass();
+
+ if (declaringClass == theClass) {
+ return metaMethod;
+ }
+
+ int modifiers = cachedMethod.getModifiers();
+
+ // if caller can access the method,
+ // no need to transform the meta method
+ if (checkAccessible(caller, declaringClass, modifiers, false)) {
+ return metaMethod;
+ }
+
+ // if caller can not access the method,
+ // try to find the corresponding method in its derived class
+ if (declaringClass.isAssignableFrom(theClass)) {
+ Optional<Method> optionalMethod = ReflectionUtils.getMethod(theClass, metaMethod.getName(), params);
+ if (optionalMethod.isPresent()) {
+ return new CachedMethod(optionalMethod.get());
+ }
+ }
+
+ return metaMethod;
+ }
+
+ private static boolean checkAccessible(Class<?> caller, Class<?> declaringClass, int modifiers, boolean allowIllegalAccess) {
+ Module callerModule = caller.getModule();
+ Module declaringModule = declaringClass.getModule();
+ String pn = declaringClass.getPackageName();
+
+ boolean unnamedModuleAccessNamedModule = !callerModule.isNamed() && declaringModule.isNamed();
+ boolean illegalAccess = !allowIllegalAccess && unnamedModuleAccessNamedModule;
+
+ // class is public and package is exported to caller
+ boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers());
+ if (isClassPublic && declaringModule.isExported(pn, callerModule)) {
+ // member is public
+ if (Modifier.isPublic(modifiers)) {
+ if (illegalAccess) {
+ return false;
+ }
+
+ return true;
+ }
+
+ // member is protected-static
+ if (Modifier.isProtected(modifiers)
+ && Modifier.isStatic(modifiers)
+ && isSubclassOf(caller, declaringClass)) {
+ if (illegalAccess) {
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ // package is open to caller
+ if (declaringModule.isOpen(pn, callerModule)) {
+ if (illegalAccess) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private static boolean isSubclassOf(Class<?> queryClass, Class<?> ofClass) {
+ while (queryClass != null) {
+ if (queryClass == ofClass) {
+ return true;
+ }
+ queryClass = queryClass.getSuperclass();
+ }
+ return false;
+ }
+}
diff --git a/src/test/groovy/bugs/Groovy8339Bug.groovy b/src/test/groovy/bugs/Groovy8339Bug.groovy
new file mode 100644
index 0000000000..5fa94f5339
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8339Bug.groovy
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package groovy.bugs
+
+// TODO add JVM option `--illegal-access=deny` when all warnings fixed
+class Groovy8339Bug extends GroovyTestCase {
+ void testCase2() {
+ StringBuilder sb = new StringBuilder()
+ sb.setLength(0)
+ }
+}
diff --git a/src/test/org/codehaus/groovy/reflection/SecurityTest.java b/src/test/org/codehaus/groovy/reflection/SecurityTest.java
new file mode 100644
index 0000000000..229865e91e
--- /dev/null
+++ b/src/test/org/codehaus/groovy/reflection/SecurityTest.java
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.codehaus.groovy.reflection;
+
+import groovy.lang.GroovyObjectSupport;
+import groovy.util.GroovyTestCase;
+import org.codehaus.groovy.runtime.InvokerInvocationException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.ReflectPermission;
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+import java.security.AccessControlException;
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.ProtectionDomain;
+
+import static groovy.test.GroovyAssert.isAtLeastJdk;
+
+public class SecurityTest extends GroovyTestCase {
+
+ @SuppressWarnings("unused")
+ public class TestClass{
+ public String publicField;
+ protected String protectedField;
+ String packagePrivateField;
+ private String privateField;
+
+ private boolean methodCalled = false;
+
+ public void publicMethod() {
+ privateMethod();
+ }
+
+ private void privateMethod() {
+ methodCalled = true;
+ }
+
+ void packagePrivateMethod() {
+ privateMethod();
+ }
+
+ void protectedMethod() {
+ privateMethod();
+ }
+
+ public boolean isMethodCalled() {
+ return methodCalled;
+ }
+ }
+
+ @SuppressWarnings("unused")
+ public class TestGroovyClass extends GroovyObjectSupport{
+ private String privateField;
+ private boolean methodCalled = false;
+ private void privateMethod() {
+ methodCalled = true;
+ }
+ public boolean isMethodCalled() {
+ return methodCalled;
+ }
+ }
+ SecurityManager restrictiveSecurityManager;
+ CachedMethod cachedMethodUnderTest;
+ CachedField cachedFieldUnderTest;
+ Permissions forbidden;
+
+ public void setUp() {
+ forbidden = new Permissions();
+ forbidden.add(new ReflectPermission("suppressAccessChecks"));
+ restrictiveSecurityManager = new SecurityManager() {
+
+ @Override
+ public void checkPermission(Permission perm) {
+ if (forbidden.implies(perm))
+ throw new AccessControlException(perm.getName());
+ }
+ };
+ }
+
+ public void tearDown(){
+ System.setSecurityManager(null);
+ }
+
+ private CachedMethod createCachedMethod(String name) throws Exception {
+ return createCachedMethod(TestClass.class, name);
+ }
+
+ private CachedMethod createCachedMethod(Class<?> cachedClass, String methodName, Class... parameters) throws NoSuchMethodException {
+ Method method = cachedClass.getDeclaredMethod(methodName, parameters);
+ method.setAccessible(true);
+ return new CachedMethod(null, method);
+ }
+
+ private boolean invokesCachedMethod() {
+ TestClass object = new TestClass();
+ cachedMethodUnderTest.invoke(object, new Object[]{});
+ return object.isMethodCalled();
+ }
+
+ private CachedField createCachedField(String name) throws Exception {
+ Field field = TestClass.class.getDeclaredField(name);
+ field.setAccessible(true);
+ return new CachedField(field);
+ }
+
+ public void testInvokesPublicMethodsWithoutChecks() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("publicMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ assertTrue(invokesCachedMethod());
+ }
+
+ public void testReturnsAccesiblePublicMethodsWithoutChecks() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("publicMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ assertEquals("publicMethod", cachedMethodUnderTest.setAccessible().getName());
+ assertEquals("publicMethod", cachedMethodUnderTest.getName());
+ }
+
+ public void testAccessesPublicFieldsWithoutChecks() throws Exception {
+ cachedFieldUnderTest = createCachedField("publicField");
+ System.setSecurityManager(restrictiveSecurityManager);
+ TestClass object = new TestClass();
+ cachedFieldUnderTest.setProperty(object, "value");
+ assertEquals("value", cachedFieldUnderTest.getProperty(object));
+ }
+
+ public void testInvokesPrivateMethodsWithoutSecurityManager() throws Exception{
+ cachedMethodUnderTest = createCachedMethod("privateMethod");
+ assertTrue(invokesCachedMethod());
+ }
+
+ public void testAccessesPrivateFieldsWithoutSecurityManager() throws Exception {
+ cachedFieldUnderTest = createCachedField("privateField");
+ System.setSecurityManager(null);
+ TestClass object = new TestClass();
+ cachedFieldUnderTest.setProperty(object, "value");
+ assertEquals("value", cachedFieldUnderTest.getProperty(object));
+ }
+
+ public void testReturnsAccesiblePrivateMethodsWithoutSecurityManager() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("privateMethod");
+ System.setSecurityManager(null);
+ assertEquals("privateMethod", cachedMethodUnderTest.setAccessible().getName());
+ assertEquals("privateMethod", cachedMethodUnderTest.getName());
+ }
+
+ public void testChecksReflectPermissionForInvokeOnPrivateMethods() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("privateMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ try {
+ invokesCachedMethod();
+ fail();
+ }
+ catch (InvokerInvocationException e) {
+ assertEquals(CacheAccessControlException.class, e.getCause().getClass());
+ }
+ }
+
+ public void testChecksReflectPermissionForFieldAccessOnPrivateFields() throws Exception {
+ cachedFieldUnderTest = createCachedField("privateField");
+ System.setSecurityManager(restrictiveSecurityManager);
+ TestClass object = new TestClass();
+ try {
+ cachedFieldUnderTest.setProperty(object, "value");
+ fail();
+ }
+ catch (CacheAccessControlException e) {
+ }
+
+ try {
+ cachedFieldUnderTest.getProperty(object);
+ fail();
+ }
+ catch (CacheAccessControlException e) {
+ }
+ }
+
+ public void testChecksReflectPermissionForMethodAccessOnPrivateMethods() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("privateMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ try {
+ cachedMethodUnderTest.setAccessible();
+ fail();
+ }
+ catch (CacheAccessControlException e) {
+ }
+
+ try {
+ cachedMethodUnderTest.getCachedMethod();
+ fail();
+ }
+ catch (CacheAccessControlException e) {
+ }
+ }
+
+ public void testInvokesPackagePrivateMethodsWithoutChecksInNonRestrictedPackages() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("packagePrivateMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ assertTrue(invokesCachedMethod());
+ }
+
+ public void testChecksReflectPermissionForInvokeOnPackagePrivateMethodsInRestrictedJavaPackages() throws Exception {
+ // FIX_JDK9 remove this exemption for JDK9
+ if (isAtLeastJdk("9.0")) {
+ return;
+ }
+ cachedMethodUnderTest = createCachedMethod(ClassLoader.class, "getBootstrapClassPath", new Class[0]);
+ System.setSecurityManager(restrictiveSecurityManager);
+
+ try {
+ cachedMethodUnderTest.invoke(null, new Object[]{});
+ fail();
+ }
+ catch (InvokerInvocationException e) {
+ assertEquals(CacheAccessControlException.class, e.getCause().getClass());
+ }
+ }
+
+ public void testInvokesProtectedMethodsWithoutChecks() throws Exception {
+ cachedMethodUnderTest = createCachedMethod("protectedMethod");
+ System.setSecurityManager(restrictiveSecurityManager);
+ assertTrue(invokesCachedMethod());
+ }
+
+
+ public void testChecksCreateClassLoaderPermissionForClassLoaderProtectedMethodAccess() throws Exception {
+ cachedMethodUnderTest = createCachedMethod(ClassLoader.class, "defineClass", new Class[]{String.class, ByteBuffer.class, ProtectionDomain.class});
+ forbidden = new Permissions();
+ forbidden.add(new RuntimePermission("createClassLoader"));
+ System.setSecurityManager(restrictiveSecurityManager);
+
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ try {
+ cachedMethodUnderTest.invoke(classLoader, new Object[]{null, null, null});
+ fail();
+ }
+ catch (InvokerInvocationException e) {
+ assertEquals(CacheAccessControlException.class, e.getCause().getClass());
+ }
+ }
+
+ public void testInvokesPrivateMethodsInGroovyObjectsWithoutChecks() throws Exception {
+ cachedMethodUnderTest = createCachedMethod(TestGroovyClass.class, "privateMethod");
+ TestGroovyClass object = new TestGroovyClass();
+ System.setSecurityManager(restrictiveSecurityManager);
+ cachedMethodUnderTest.invoke(object, new Object[]{});
+ assertTrue(object.isMethodCalled());
+ }
+
+ public void testAccessesPrivateFieldsInGroovyObjectsWithoutChecks() throws Exception {
+ Field field = TestGroovyClass.class.getDeclaredField("privateField");
+ field.setAccessible(true);
+ cachedFieldUnderTest = new CachedField(field);
+ TestGroovyClass object = new TestGroovyClass();
+ System.setSecurityManager(restrictiveSecurityManager);
+ cachedFieldUnderTest.setProperty(object, "value");
+ assertEquals("value", cachedFieldUnderTest.getProperty(object));
+ }
+
+}
diff --git a/subprojects/groovy-ant/src/main/java/groovy/util/AntBuilder.java b/subprojects/groovy-ant/src/main/java/groovy/util/AntBuilder.java
index 92961e4648..a4e04a79e0 100644
--- a/subprojects/groovy-ant/src/main/java/groovy/util/AntBuilder.java
+++ b/subprojects/groovy-ant/src/main/java/groovy/util/AntBuilder.java
@@ -35,6 +35,7 @@ import org.apache.tools.ant.dispatch.DispatchUtils;
import org.apache.tools.ant.helper.AntXMLContext;
import org.apache.tools.ant.helper.ProjectHelper2;
import org.codehaus.groovy.ant.FileScanner;
+import org.codehaus.groovy.reflection.ReflectionUtils;
import org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
@@ -325,7 +326,7 @@ public class AntBuilder extends BuilderSupport {
try {
// Have to call fireTestStared/fireTestFinished via reflection as they unfortunately have protected access in Project
final Method fireTaskStarted = Project.class.getDeclaredMethod("fireTaskStarted", Task.class);
- fireTaskStarted.setAccessible(true);
+ ReflectionUtils.trySetAccessible(fireTaskStarted);
fireTaskStarted.invoke(project, task);
Object realThing;
@@ -359,7 +360,7 @@ public class AntBuilder extends BuilderSupport {
finally {
try {
final Method fireTaskFinished = Project.class.getDeclaredMethod("fireTaskFinished", Task.class, Throwable.class);
- fireTaskFinished.setAccessible(true);
+ ReflectionUtils.trySetAccessible(fireTaskFinished);
fireTaskFinished.invoke(project, task, reason);
}
catch (Exception e) {
diff --git a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovy.java b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovy.java
index aae992b8ba..48fd137328 100644
--- a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovy.java
+++ b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovy.java
@@ -35,6 +35,7 @@ import org.apache.tools.ant.util.FileUtils;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.customizers.ImportCustomizer;
+import org.codehaus.groovy.reflection.ReflectionUtils;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.ResourceGroovyMethods;
import org.codehaus.groovy.tools.ErrorReporter;
@@ -413,7 +414,7 @@ public class Groovy extends Java {
try {
final Object propsHandler = project.getClass().getMethod("getPropsHandler").invoke(project);
final Field contextField = propsHandler.getClass().getDeclaredField("context");
- contextField.setAccessible(true);
+ ReflectionUtils.trySetAccessible(contextField);
final Object context = contextField.get(propsHandler);
mavenPom = InvokerHelper.invokeMethod(context, "getProject", EMPTY_OBJECT_ARRAY);
}
diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/util/PackageHelperImpl.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/util/PackageHelperImpl.groovy
index 73f9f7d32a..3b537343a3 100644
--- a/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/util/PackageHelperImpl.groovy
+++ b/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/util/PackageHelperImpl.groovy
@@ -163,12 +163,14 @@ def filterClassName(Path path) {
}
}
+class GroovyFileVisitor extends SimpleFileVisitor {}
+
// walk each file and directory, possibly storing directories as packages, and files as classes
Files.walkFileTree(fs.getPath('modules'),
[preVisitDirectory: { dir, attrs -> filterPackageName(dir); FileVisitResult.CONTINUE },
visitFile: { file, attrs -> filterClassName(file); FileVisitResult.CONTINUE}
]
- as SimpleFileVisitor)
+ as GroovyFileVisitor)
'''
Set<String> jigsawPackages = (Set<String>) shell.getProperty('result')
diff --git a/subprojects/groovy-swing/src/main/java/org/codehaus/groovy/binding/ClosureTriggerBinding.java b/subprojects/groovy-swing/src/main/java/org/codehaus/groovy/binding/ClosureTriggerBinding.java
index 8a0fecb2ec..7a08f753d7 100644
--- a/subprojects/groovy-swing/src/main/java/org/codehaus/groovy/binding/ClosureTriggerBinding.java
+++ b/subprojects/groovy-swing/src/main/java/org/codehaus/groovy/binding/ClosureTriggerBinding.java
@@ -21,6 +21,7 @@ package org.codehaus.groovy.binding;
import groovy.lang.Closure;
import groovy.lang.GroovyObjectSupport;
import groovy.lang.Reference;
+import org.codehaus.groovy.reflection.ReflectionUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -81,13 +82,13 @@ public class ClosureTriggerBinding implements TriggerBinding, SourceBinding {
}
try {
boolean acc = constructor.isAccessible();
- constructor.setAccessible(true);
+ ReflectionUtils.trySetAccessible(constructor);
Closure localCopy = (Closure) constructor.newInstance(args);
if (!acc) { constructor.setAccessible(false); }
localCopy.setResolveStrategy(Closure.DELEGATE_ONLY);
for (Field f:closureClass.getDeclaredFields()) {
acc = f.isAccessible();
- f.setAccessible(true);
+ ReflectionUtils.trySetAccessible(f);
if (f.getType() == Reference.class) {
delegate.fields.put(f.getName(),
(BindPathSnooper) ((Reference) f.get(localCopy)).get());
diff --git a/subprojects/groovy-swing/src/test/groovy/groovy/beans/BindableSwingTest.groovy b/subprojects/groovy-swing/src/test/groovy/groovy/beans/BindableSwingTest.groovy
index f17a37ba5c..39135b8f08 100644
--- a/subprojects/groovy-swing/src/test/groovy/groovy/beans/BindableSwingTest.groovy
+++ b/subprojects/groovy-swing/src/test/groovy/groovy/beans/BindableSwingTest.groovy
@@ -30,6 +30,17 @@ class BindableSwingTest extends GroovySwingTestCase {
class BindableTestBean6 extends javax.swing.JPanel {
@Bindable String testField
+
+ /*
+ // if the following stub added, the illegal access warnings can be fixed
+ // java.awt.Component.firePropertyChange(java.lang.String,java.lang.Object,java.lang.Object)
+ // should we add this kind of stubs automatically?
+ void firePropertyChange(String propertyName,
+ Object oldValue, Object newValue) {
+
+ super.firePropertyChange(propertyName, oldValue, newValue)
+ }
+ */
}
sb = new BindableTestBean6()
--
2.36.1