• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import static art.Redefinition.doCommonClassRedefinition;
18 import java.util.Base64;
19 import java.util.Random;
20 import java.util.function.*;
21 import java.util.stream.*;
22 
23 public class Main {
24 
25   // The bytes below define the following java program.
26   // To generate the bytes from the following Long.java file:
27   // 1. Commit your Long.java change: git commit -- libcore/ojluni/src/main/java/java/lang/Long.java
28   // 2. Copy the following java program into libcore/ojluni/src/main/java/java/lang/Long.java
29   // 3. Run this build command: m core-all && d8 --classpath out/soong/.intermediates/libcore/core-all/android_common/javac/classes/  out/soong/.intermediates/libcore/core-all/android_common/javac/classes/java/lang/Long.class && base64 out/soong/.intermediates/libcore/core-all/android_common/javac/classes/java/lang/Long.class > class_Long.txt && base64 classes.dex > dex_Long.txt
30   // 4. Copy class_Long.txt into CLASS_BYTES String and dex_Long.txt into DEX_BYTES
31   // 5. Checkout the original Long.java: croot libcore && git checkout ojluni/src/main/java/java/lang/Long.java
32   // package java.lang;
33   // import java.lang.constant.Constable;
34   // import java.lang.constant.ConstantDesc;
35   // import java.lang.invoke.MethodHandles;
36   // import java.math.*;
37   //
38   // import java.util.Optional;
39   // public final class Long extends Number implements Comparable<Long>, Constable, ConstantDesc {
40   //     public static final long MIN_VALUE = 0;
41   //     public static final long MAX_VALUE = 0;
42   //     public static final Class<Long> TYPE = null;
43   //     static { }
44   //     // Used for Stream.count for some reason.
45   //     public static long sum(long a, long b) {
46   //       return a + b;
47   //     }
48   //     // Used in stream/lambda functions.
49   //     public Long(long value) {
50   //       this.value = value;
51   //     }
52   //     // Used in stream/lambda functions.
53   //     public static Long valueOf(long l) {
54   //       return new Long(l);
55   //     }
56   //     // Intrinsic! Do something cool. Return i + 1
57   //     public static long highestOneBit(long i) {
58   //       return i + 1;
59   //     }
60   //     // Intrinsic! Do something cool. Return i - 1
61   //     public static long lowestOneBit(long i) {
62   //       return i - 1;
63   //     }
64   //     // Intrinsic! Do something cool. Return i + i
65   //     public static int numberOfLeadingZeros(long i) {
66   //       return (int)(i + i);
67   //     }
68   //     // Intrinsic! Do something cool. Return i & (i >>> 1);
69   //     public static int numberOfTrailingZeros(long i) {
70   //       return (int)(i & (i >>> 1));
71   //     }
72   //     // Intrinsic! Do something cool. Return 5
73   //      public static int bitCount(long i) {
74   //        return 5;
75   //      }
76   //     // Intrinsic! Do something cool. Return i
77   //     public static long rotateLeft(long i, int distance) {
78   //       return i;
79   //     }
80   //     // Intrinsic! Do something cool. Return 10 * i
81   //     public static long rotateRight(long i, int distance) {
82   //       return 10 * i;
83   //     }
84   //     // Intrinsic! Do something cool. Return -i
85   //     public static long reverse(long i) {
86   //       return -i;
87   //     }
88   //     // Intrinsic! Do something cool. Return 0
89   //     public static int signum(long i) {
90   //       return 0;
91   //     }
92   //     // Intrinsic! Do something cool. Return 0
93   //     public static long reverseBytes(long i) {
94   //       return 0;
95   //     }
96   //     public String toString() {
97   //       return "Redefined Long! value (as double)=" + ((double)value);
98   //     }
99   //     public static String toString(long i, int radix) {
100   //       throw new Error("Method redefined away!");
101   //     }
102   //     public static String toUnsignedString(long i, int radix) {
103   //       throw new Error("Method redefined away!");
104   //     }
105   //     private static BigInteger toUnsignedBigInteger(long i) {
106   //       throw new Error("Method redefined away!");
107   //     }
108   //     public static String toHexString(long i) {
109   //       throw new Error("Method redefined away!");
110   //     }
111   //     public static String toOctalString(long i) {
112   //       throw new Error("Method redefined away!");
113   //     }
114   //     public static String toBinaryString(long i) {
115   //       throw new Error("Method redefined away!");
116   //     }
117   //     static String toUnsignedString0(long val, int shift) {
118   //       throw new Error("Method redefined away!");
119   //     }
120   //     static void formatUnsignedLong0(long val, int shift, byte[] buf, int offset, int len) {
121   //       throw new Error("Method redefined away!");
122   //     }
123   //     public static String toString(long i) {
124   //       throw new Error("Method redefined away!");
125   //     }
126   //     public static String toUnsignedString(long i) {
127   //       throw new Error("Method redefined away!");
128   //     }
129   //     static int getChars(long i, int index, byte[] buf) {
130   //       throw new Error("Method redefined away!");
131   //     }
132   //     static int getChars(long i, int index, char[] buf) {
133   //       throw new Error("Method redefined away!");
134   //     }
135   //     static int stringSize(long x) {
136   //       throw new Error("Method redefined away!");
137   //     }
138   //     public static long parseLong(String s, int radix) throws NumberFormatException {
139   //       throw new Error("Method redefined away!");
140   //     }
141   //     public static long parseLong(String s) throws NumberFormatException {
142   //       throw new Error("Method redefined away!");
143   //     }
144   //     public static long parseLong(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException {
145   //       throw new Error("Method redefined away!");
146   //     }
147   //     public static long parseUnsignedLong(String s, int radix) throws NumberFormatException {
148   //       throw new Error("Method redefined away!");
149   //     }
150   //     public static long parseUnsignedLong(String s) throws NumberFormatException {
151   //       throw new Error("Method redefined away!");
152   //     }
153   //     public static long parseUnsignedLong(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException {
154   //       throw new Error("Method redefined away!");
155   //     }
156   //     public static Long valueOf(String s, int radix) throws NumberFormatException {
157   //       throw new Error("Method redefined away!");
158   //     }
159   //     public static Long valueOf(String s) throws NumberFormatException {
160   //       throw new Error("Method redefined away!");
161   //     }
162   //     public static Long decode(String nm) throws NumberFormatException {
163   //       throw new Error("Method redefined away!");
164   //     }
165   //     private final long value;
166   //     public Long(String s) throws NumberFormatException {
167   //       this(0);
168   //       throw new Error("Method redefined away!");
169   //     }
170   //     public byte byteValue() {
171   //       throw new Error("Method redefined away!");
172   //     }
173   //     public short shortValue() {
174   //       throw new Error("Method redefined away!");
175   //     }
176   //     public int intValue() {
177   //       throw new Error("Method redefined away!");
178   //     }
179   //     public long longValue() {
180   //       return value;
181   //     }
182   //     public float floatValue() {
183   //       throw new Error("Method redefined away!");
184   //     }
185   //     public double doubleValue() {
186   //       throw new Error("Method redefined away!");
187   //     }
188   //     public int hashCode() {
189   //       throw new Error("Method redefined away!");
190   //     }
191   //     public static int hashCode(long value) {
192   //       throw new Error("Method redefined away!");
193   //     }
194   //     public boolean equals(Object obj) {
195   //       throw new Error("Method redefined away!");
196   //     }
197   //     public static Long getLong(String nm) {
198   //       throw new Error("Method redefined away!");
199   //     }
200   //     public static Long getLong(String nm, long val) {
201   //       throw new Error("Method redefined away!");
202   //     }
203   //     public static Long getLong(String nm, Long val) {
204   //       throw new Error("Method redefined away!");
205   //     }
206   //     public int compareTo(Long anotherLong) {
207   //       throw new Error("Method redefined away!");
208   //     }
209   //     public static int compare(long x, long y) {
210   //       throw new Error("Method redefined away!");
211   //     }
212   //     public static int compareUnsigned(long x, long y) {
213   //       throw new Error("Method redefined away!");
214   //     }
215   //     public static long divideUnsigned(long dividend, long divisor) {
216   //       throw new Error("Method redefined away!");
217   //     }
218   //     public static long remainderUnsigned(long dividend, long divisor) {
219   //       throw new Error("Method redefined away!");
220   //     }
221   //     public static final int SIZE = 64;
222   //     public static final int BYTES = SIZE / Byte.SIZE;
223   //     public static long max(long a, long b) {
224   //       throw new Error("Method redefined away!");
225   //     }
226   //     public static long min(long a, long b) {
227   //       throw new Error("Method redefined away!");
228   //     }
229   //     private static final long serialVersionUID = 0;
230   //
231   //     /** @hide */
232   //     @Override
233   //     public Optional<? extends ConstantDesc> describeConstable() {
234   //       throw new Error("Method redefined away!");
235   //     }
236   //
237   //     /** @hide */
238   //     @Override
239   //     public Object resolveConstantDesc(MethodHandles.Lookup lookup) {
240   //       throw new Error("Method redefined away!");
241   //     }
242   // }
243   private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
244     "yv66vgAAAD0AwQcAAgEADmphdmEvbGFuZy9Mb25nBwAEAQAOamF2YS9sYW5nL0J5dGUKAAYABwcA" +
245     "CAwACQAKAQAQamF2YS9sYW5nL051bWJlcgEABjxpbml0PgEAAygpVgkAAQAMDAANAA4BAAV2YWx1" +
246     "ZQEAAUoKAAEAEAwACQARAQAEKEopVgUAAAAAAAAACgcAFQEAF2phdmEvbGFuZy9TdHJpbmdCdWls" +
247     "ZGVyCgAUAAcIABgBACJSZWRlZmluZWQgTG9uZyEgdmFsdWUgKGFzIGRvdWJsZSk9CgAUABoMABsA" +
248     "HAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVy" +
249     "OwoAFAAeDAAbAB8BABwoRClMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgAUACEMACIAIwEACHRv" +
250     "U3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsHACUBAA9qYXZhL2xhbmcvRXJyb3IIACcBABZN" +
251     "ZXRob2QgcmVkZWZpbmVkIGF3YXkhCgAkACkMAAkAKgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoA" +
252     "AQAsDAAtAC4BAAljb21wYXJlVG8BABMoTGphdmEvbGFuZy9Mb25nOylJCgABADAMADEAMgEAE3Jl" +
253     "c29sdmVDb25zdGFudERlc2MBADkoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29r" +
254     "dXA7KUxqYXZhL2xhbmcvTG9uZzsJAAEANAwANQA2AQAEVFlQRQEAEUxqYXZhL2xhbmcvQ2xhc3M7" +
255     "BwA4AQAUamF2YS9sYW5nL0NvbXBhcmFibGUHADoBABxqYXZhL2xhbmcvY29uc3RhbnQvQ29uc3Rh" +
256     "YmxlBwA8AQAfamF2YS9sYW5nL2NvbnN0YW50L0NvbnN0YW50RGVzYwEACU1JTl9WQUxVRQEADUNv" +
257     "bnN0YW50VmFsdWUFAAAAAAAAAAABAAlNQVhfVkFMVUUBAAlTaWduYXR1cmUBACNMamF2YS9sYW5n" +
258     "L0NsYXNzPExqYXZhL2xhbmcvTG9uZzs+OwEABFNJWkUBAAFJAwAAAEABAAVCWVRFUwMAAAAIAQAQ" +
259     "c2VyaWFsVmVyc2lvblVJRAEAA3N1bQEABShKSilKAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEA" +
260     "EkxvY2FsVmFyaWFibGVUYWJsZQEAAWEBAAFiAQAEdGhpcwEAEExqYXZhL2xhbmcvTG9uZzsBAAd2" +
261     "YWx1ZU9mAQATKEopTGphdmEvbGFuZy9Mb25nOwEAAWwBAA1oaWdoZXN0T25lQml0AQAEKEopSgEA" +
262     "AWkBAAxsb3dlc3RPbmVCaXQBABRudW1iZXJPZkxlYWRpbmdaZXJvcwEABChKKUkBABVudW1iZXJP" +
263     "ZlRyYWlsaW5nWmVyb3MBAAhiaXRDb3VudAEACnJvdGF0ZUxlZnQBAAUoSkkpSgEACGRpc3RhbmNl" +
264     "AQALcm90YXRlUmlnaHQBAAdyZXZlcnNlAQAGc2lnbnVtAQAMcmV2ZXJzZUJ5dGVzAQAWKEpJKUxq" +
265     "YXZhL2xhbmcvU3RyaW5nOwEABXJhZGl4AQAQdG9VbnNpZ25lZFN0cmluZwEAFHRvVW5zaWduZWRC" +
266     "aWdJbnRlZ2VyAQAZKEopTGphdmEvbWF0aC9CaWdJbnRlZ2VyOwEAC3RvSGV4U3RyaW5nAQAVKEop" +
267     "TGphdmEvbGFuZy9TdHJpbmc7AQANdG9PY3RhbFN0cmluZwEADnRvQmluYXJ5U3RyaW5nAQARdG9V" +
268     "bnNpZ25lZFN0cmluZzABAAN2YWwBAAVzaGlmdAEAE2Zvcm1hdFVuc2lnbmVkTG9uZzABAAkoSklb" +
269     "QklJKVYBAANidWYBAAJbQgEABm9mZnNldAEAA2xlbgEACGdldENoYXJzAQAHKEpJW0IpSQEABWlu" +
270     "ZGV4AQAHKEpJW0MpSQEAAltDAQAKc3RyaW5nU2l6ZQEAAXgBAAlwYXJzZUxvbmcBABYoTGphdmEv" +
271     "bGFuZy9TdHJpbmc7SSlKAQABcwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACkV4Y2VwdGlvbnMHAIQB" +
272     "AB9qYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uAQAVKExqYXZhL2xhbmcvU3RyaW5nOylK" +
273     "AQAeKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlO0lJSSlKAQAYTGphdmEvbGFuZy9DaGFyU2VxdWVu" +
274     "Y2U7AQAKYmVnaW5JbmRleAEACGVuZEluZGV4AQARcGFyc2VVbnNpZ25lZExvbmcBACUoTGphdmEv" +
275     "bGFuZy9TdHJpbmc7SSlMamF2YS9sYW5nL0xvbmc7AQAkKExqYXZhL2xhbmcvU3RyaW5nOylMamF2" +
276     "YS9sYW5nL0xvbmc7AQAGZGVjb2RlAQACbm0BAAlieXRlVmFsdWUBAAMoKUIBAApzaG9ydFZhbHVl" +
277     "AQADKClTAQAIaW50VmFsdWUBAAMoKUkBAAlsb25nVmFsdWUBAAMoKUoBAApmbG9hdFZhbHVlAQAD" +
278     "KClGAQALZG91YmxlVmFsdWUBAAMoKUQBAAhoYXNoQ29kZQEABmVxdWFscwEAFShMamF2YS9sYW5n" +
279     "L09iamVjdDspWgEAA29iagEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAB2dldExvbmcBACUoTGphdmEv" +
280     "bGFuZy9TdHJpbmc7SilMamF2YS9sYW5nL0xvbmc7AQA0KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZh" +
281     "L2xhbmcvTG9uZzspTGphdmEvbGFuZy9Mb25nOwEAC2Fub3RoZXJMb25nAQAHY29tcGFyZQEABShK" +
282     "SilJAQABeQEAD2NvbXBhcmVVbnNpZ25lZAEADmRpdmlkZVVuc2lnbmVkAQAIZGl2aWRlbmQBAAdk" +
283     "aXZpc29yAQARcmVtYWluZGVyVW5zaWduZWQBAANtYXgBAANtaW4BABFkZXNjcmliZUNvbnN0YWJs" +
284     "ZQEAFigpTGphdmEvdXRpbC9PcHRpb25hbDsBAEAoKUxqYXZhL3V0aWwvT3B0aW9uYWw8TGphdmEv" +
285     "bGFuZy9jb25zdGFudC9EeW5hbWljQ29uc3RhbnREZXNjOz47AQAGbG9va3VwAQAnTGphdmEvbGFu" +
286     "Zy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7AQAVKExqYXZhL2xhbmcvT2JqZWN0OylJAQA7" +
287     "KExqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMkTG9va3VwOylMamF2YS9sYW5nL09iamVj" +
288     "dDsHALYBACZqYXZhL2xhbmcvUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbgEACDxjbGluaXQ+" +
289     "AQB5TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvTG9u" +
290     "Zzs+O0xqYXZhL2xhbmcvY29uc3RhbnQvQ29uc3RhYmxlO0xqYXZhL2xhbmcvY29uc3RhbnQvQ29u" +
291     "c3RhbnREZXNjOwEAClNvdXJjZUZpbGUBAAlMb25nLmphdmEBAAxJbm5lckNsYXNzZXMHAL0BACVq" +
292     "YXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMkTG9va3VwBwC/AQAeamF2YS9sYW5nL2ludm9r" +
293     "ZS9NZXRob2RIYW5kbGVzAQAGTG9va3VwADEAAQAGAAMANwA5ADsABwAZAD0ADgABAD4AAAACAD8A" +
294     "GQBBAA4AAQA+AAAAAgA/ABkANQA2AAEAQgAAAAIAQwASAA0ADgAAABkARABFAAEAPgAAAAIARgAZ" +
295     "AEcARQABAD4AAAACAEgAGgBJAA4AAQA+AAAAAgA/AD0ACQBKAEsAAQBMAAAAOAAEAAQAAAAEHiBh" +
296     "rQAAAAIATQAAAAYAAQAAABAATgAAABYAAgAAAAQATwAOAAAAAAAEAFAADgACAAEACQARAAEATAAA" +
297     "AEYAAwADAAAACiq3AAUqH7UAC7EAAAACAE0AAAAOAAMAAAATAAQAFAAJABUATgAAABYAAgAAAAoA" +
298     "UQBSAAAAAAAKAA0ADgABAAkAUwBUAAEATAAAADMABAACAAAACbsAAVketwAPsAAAAAIATQAAAAYA" +
299     "AQAAABgATgAAAAwAAQAAAAkAVQAOAAAACQBWAFcAAQBMAAAALgAEAAIAAAAEHgphrQAAAAIATQAA" +
300     "AAYAAQAAABwATgAAAAwAAQAAAAQAWAAOAAAACQBZAFcAAQBMAAAALgAEAAIAAAAEHgplrQAAAAIA" +
301     "TQAAAAYAAQAAACAATgAAAAwAAQAAAAQAWAAOAAAACQBaAFsAAQBMAAAALwAEAAIAAAAFHh5hiKwA" +
302     "AAACAE0AAAAGAAEAAAAkAE4AAAAMAAEAAAAFAFgADgAAAAkAXABbAAEATAAAADEABQACAAAABx4e" +
303     "BH1/iKwAAAACAE0AAAAGAAEAAAAoAE4AAAAMAAEAAAAHAFgADgAAAAkAXQBbAAEATAAAACwAAQAC" +
304     "AAAAAgisAAAAAgBNAAAABgABAAAALABOAAAADAABAAAAAgBYAA4AAAAJAF4AXwABAEwAAAA2AAIA" +
305     "AwAAAAIerQAAAAIATQAAAAYAAQAAADAATgAAABYAAgAAAAIAWAAOAAAAAAACAGAARQACAAkAYQBf" +
306     "AAEATAAAADoABAADAAAABhQAEh5prQAAAAIATQAAAAYAAQAAADQATgAAABYAAgAAAAYAWAAOAAAA" +
307     "AAAGAGAARQACAAkAYgBXAAEATAAAAC0AAgACAAAAAx51rQAAAAIATQAAAAYAAQAAADgATgAAAAwA" +
308     "AQAAAAMAWAAOAAAACQBjAFsAAQBMAAAALAABAAIAAAACA6wAAAACAE0AAAAGAAEAAAA8AE4AAAAM" +
309     "AAEAAAACAFgADgAAAAkAZABXAAEATAAAACwAAgACAAAAAgmtAAAAAgBNAAAABgABAAAAQABOAAAA" +
310     "DAABAAAAAgBYAA4AAAABACIAIwABAEwAAABCAAMAAQAAABi7ABRZtwAWEhe2ABkqtAALirYAHbYA" +
311     "ILAAAAACAE0AAAAGAAEAAABDAE4AAAAMAAEAAAAYAFEAUgAAAAkAIgBlAAEATAAAAD4AAwADAAAA" +
312     "CrsAJFkSJrcAKL8AAAACAE0AAAAGAAEAAABGAE4AAAAWAAIAAAAKAFgADgAAAAAACgBmAEUAAgAJ" +
313     "AGcAZQABAEwAAAA+AAMAAwAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAASQBOAAAAFgACAAAA" +
314     "CgBYAA4AAAAAAAoAZgBFAAIACgBoAGkAAQBMAAAANAADAAIAAAAKuwAkWRImtwAovwAAAAIATQAA" +
315     "AAYAAQAAAEwATgAAAAwAAQAAAAoAWAAOAAAACQBqAGsAAQBMAAAANAADAAIAAAAKuwAkWRImtwAo" +
316     "vwAAAAIATQAAAAYAAQAAAE8ATgAAAAwAAQAAAAoAWAAOAAAACQBsAGsAAQBMAAAANAADAAIAAAAK" +
317     "uwAkWRImtwAovwAAAAIATQAAAAYAAQAAAFIATgAAAAwAAQAAAAoAWAAOAAAACQBtAGsAAQBMAAAA" +
318     "NAADAAIAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAFUATgAAAAwAAQAAAAoAWAAOAAAACABu" +
319     "AGUAAQBMAAAAPgADAAMAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAFgATgAAABYAAgAAAAoA" +
320     "bwAOAAAAAAAKAHAARQACAAgAcQByAAEATAAAAFwAAwAGAAAACrsAJFkSJrcAKL8AAAACAE0AAAAG" +
321     "AAEAAABbAE4AAAA0AAUAAAAKAG8ADgAAAAAACgBwAEUAAgAAAAoAcwB0AAMAAAAKAHUARQAEAAAA" +
322     "CgB2AEUABQAJACIAawABAEwAAAA0AAMAAgAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAXgBO" +
323     "AAAADAABAAAACgBYAA4AAAAJAGcAawABAEwAAAA0AAMAAgAAAAq7ACRZEia3ACi/AAAAAgBNAAAA" +
324     "BgABAAAAYQBOAAAADAABAAAACgBYAA4AAAAIAHcAeAABAEwAAABIAAMABAAAAAq7ACRZEia3ACi/" +
325     "AAAAAgBNAAAABgABAAAAZABOAAAAIAADAAAACgBYAA4AAAAAAAoAeQBFAAIAAAAKAHMAdAADAAgA" +
326     "dwB6AAEATAAAAEgAAwAEAAAACrsAJFkSJrcAKL8AAAACAE0AAAAGAAEAAABnAE4AAAAgAAMAAAAK" +
327     "AFgADgAAAAAACgB5AEUAAgAAAAoAcwB7AAMACAB8AFsAAQBMAAAANAADAAIAAAAKuwAkWRImtwAo" +
328     "vwAAAAIATQAAAAYAAQAAAGoATgAAAAwAAQAAAAoAfQAOAAAACQB+AH8AAgBMAAAAPgADAAIAAAAK" +
329     "uwAkWRImtwAovwAAAAIATQAAAAYAAQAAAG0ATgAAABYAAgAAAAoAgACBAAAAAAAKAGYARQABAIIA" +
330     "AAAEAAEAgwAJAH4AhQACAEwAAAA0AAMAAQAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAcABO" +
331     "AAAADAABAAAACgCAAIEAAACCAAAABAABAIMACQB+AIYAAgBMAAAAUgADAAQAAAAKuwAkWRImtwAo" +
332     "vwAAAAIATQAAAAYAAQAAAHMATgAAACoABAAAAAoAgACHAAAAAAAKAIgARQABAAAACgCJAEUAAgAA" +
333     "AAoAZgBFAAMAggAAAAQAAQCDAAkAigB/AAIATAAAAD4AAwACAAAACrsAJFkSJrcAKL8AAAACAE0A" +
334     "AAAGAAEAAAB2AE4AAAAWAAIAAAAKAIAAgQAAAAAACgBmAEUAAQCCAAAABAABAIMACQCKAIUAAgBM" +
335     "AAAANAADAAEAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAHkATgAAAAwAAQAAAAoAgACBAAAA" +
336     "ggAAAAQAAQCDAAkAigCGAAIATAAAAFIAAwAEAAAACrsAJFkSJrcAKL8AAAACAE0AAAAGAAEAAAB8" +
337     "AE4AAAAqAAQAAAAKAIAAhwAAAAAACgCIAEUAAQAAAAoAiQBFAAIAAAAKAGYARQADAIIAAAAEAAEA" +
338     "gwAJAFMAiwACAEwAAAA+AAMAAgAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAfwBOAAAAFgAC" +
339     "AAAACgCAAIEAAAAAAAoAZgBFAAEAggAAAAQAAQCDAAkAUwCMAAIATAAAADQAAwABAAAACrsAJFkS" +
340     "JrcAKL8AAAACAE0AAAAGAAEAAACCAE4AAAAMAAEAAAAKAIAAgQAAAIIAAAAEAAEAgwAJAI0AjAAC" +
341     "AEwAAAA0AAMAAQAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAhQBOAAAADAABAAAACgCOAIEA" +
342     "AACCAAAABAABAIMAAQAJACoAAgBMAAAARwADAAIAAAAPKgm3AA+7ACRZEia3ACi/AAAAAgBNAAAA" +
343     "CgACAAAAiQAFAIoATgAAABYAAgAAAA8AUQBSAAAAAAAPAIAAgQABAIIAAAAEAAEAgwABAI8AkAAB" +
344     "AEwAAAA0AAMAAQAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAjQBOAAAADAABAAAACgBRAFIA" +
345     "AAABAJEAkgABAEwAAAA0AAMAAQAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAkABOAAAADAAB" +
346     "AAAACgBRAFIAAAABAJMAlAABAEwAAAA0AAMAAQAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAA" +
347     "kwBOAAAADAABAAAACgBRAFIAAAABAJUAlgABAEwAAAAvAAIAAQAAAAUqtAALrQAAAAIATQAAAAYA" +
348     "AQAAAJYATgAAAAwAAQAAAAUAUQBSAAAAAQCXAJgAAQBMAAAANAADAAEAAAAKuwAkWRImtwAovwAA" +
349     "AAIATQAAAAYAAQAAAJkATgAAAAwAAQAAAAoAUQBSAAAAAQCZAJoAAQBMAAAANAADAAEAAAAKuwAk" +
350     "WRImtwAovwAAAAIATQAAAAYAAQAAAJwATgAAAAwAAQAAAAoAUQBSAAAAAQCbAJQAAQBMAAAANAAD" +
351     "AAEAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAJ8ATgAAAAwAAQAAAAoAUQBSAAAACQCbAFsA" +
352     "AQBMAAAANAADAAIAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAKIATgAAAAwAAQAAAAoADQAO" +
353     "AAAAAQCcAJ0AAQBMAAAAPgADAAIAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAAKUATgAAABYA" +
354     "AgAAAAoAUQBSAAAAAAAKAJ4AnwABAAkAoACMAAEATAAAADQAAwABAAAACrsAJFkSJrcAKL8AAAAC" +
355     "AE0AAAAGAAEAAACoAE4AAAAMAAEAAAAKAI4AgQAAAAkAoAChAAEATAAAAD4AAwADAAAACrsAJFkS" +
356     "JrcAKL8AAAACAE0AAAAGAAEAAACrAE4AAAAWAAIAAAAKAI4AgQAAAAAACgBvAA4AAQAJAKAAogAB" +
357     "AEwAAAA+AAMAAgAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAArgBOAAAAFgACAAAACgCOAIEA" +
358     "AAAAAAoAbwBSAAEAAQAtAC4AAQBMAAAAPgADAAIAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAA" +
359     "ALEATgAAABYAAgAAAAoAUQBSAAAAAAAKAKMAUgABAAkApAClAAEATAAAAD4AAwAEAAAACrsAJFkS" +
360     "JrcAKL8AAAACAE0AAAAGAAEAAAC0AE4AAAAWAAIAAAAKAH0ADgAAAAAACgCmAA4AAgAJAKcApQAB" +
361     "AEwAAAA+AAMABAAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAtwBOAAAAFgACAAAACgB9AA4A" +
362     "AAAAAAoApgAOAAIACQCoAEsAAQBMAAAAPgADAAQAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAA" +
363     "ALoATgAAABYAAgAAAAoAqQAOAAAAAAAKAKoADgACAAkAqwBLAAEATAAAAD4AAwAEAAAACrsAJFkS" +
364     "JrcAKL8AAAACAE0AAAAGAAEAAAC9AE4AAAAWAAIAAAAKAKkADgAAAAAACgCqAA4AAgAJAKwASwAB" +
365     "AEwAAAA+AAMABAAAAAq7ACRZEia3ACi/AAAAAgBNAAAABgABAAAAwgBOAAAAFgACAAAACgBPAA4A" +
366     "AAAAAAoAUAAOAAIACQCtAEsAAQBMAAAAPgADAAQAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAA" +
367     "AMUATgAAABYAAgAAAAoATwAOAAAAAAAKAFAADgACAAEArgCvAAIATAAAADQAAwABAAAACrsAJFkS" +
368     "JrcAKL8AAAACAE0AAAAGAAEAAADMAE4AAAAMAAEAAAAKAFEAUgAAAEIAAAACALAAAQAxADIAAQBM" +
369     "AAAAPgADAAIAAAAKuwAkWRImtwAovwAAAAIATQAAAAYAAQAAANIATgAAABYAAgAAAAoAUQBSAAAA" +
370     "AAAKALEAsgABEEEALQCzAAEATAAAADMAAgACAAAACSorwAABtgArrAAAAAIATQAAAAYAAQAAAAkA" +
371     "TgAAAAwAAQAAAAkAUQBSAAAQQQAxALQAAgBMAAAAMAACAAIAAAAGKiu2AC+wAAAAAgBNAAAABgAB" +
372     "AAAACQBOAAAADAABAAAABgBRAFIAAACCAAAABAABALUACAC3AAoAAQBMAAAAIQABAAAAAAAFAbMA" +
373     "M7EAAAABAE0AAAAKAAIAAAAMAAQADQADAEIAAAACALgAuQAAAAIAugC7AAAACgABALwAvgDAABk="
374     );
375 
376   private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
377     "ZGV4CjAzNQCC6NqF6YcFy4KrMQ61yOakOSk9scYPTAY0GgAAcAAAAHhWNBIAAAAAAAAAAGQZAACI" +
378     "AAAAcAAAABwAAACQAgAAJQAAAAADAAAHAAAAvAQAAEMAAAD0BAAAAQAAAAwHAAAIEwAALAcAAH4Q" +
379     "AACCEAAAjBAAAJQQAACYEAAAmxAAAKIQAAClEAAAqBAAAKsQAACvEAAAtRAAALoQAAC+EAAAwRAA" +
380     "AMUQAADKEAAAzxAAANMQAADYEAAA3xAAAOIQAADmEAAA6hAAAO8QAADzEAAA+BAAAP0QAAACEQAA" +
381     "IREAAD0RAABXEQAAahEAAH0RAACVEQAArREAAMARAADSEQAA5hEAAAkSAAAdEgAARxIAAFsSAAB2" +
382     "EgAAlhIAALkSAADjEgAADBMAACQTAAA6EwAAUBMAAFsTAABmEwAAcRMAAIkTAACtEwAAsBMAALYT" +
383     "AAC8EwAAvxMAAMMTAADLEwAAzxMAANITAADWEwAA2hMAAN4TAADhEwAA7hMAAPYTAAD5EwAABRQA" +
384     "AA8UAAAUFAAAHxQAACgUAAAzFAAARBQAAEwUAABfFAAAaRQAAHkUAACDFAAAjBQAAJkUAACjFAAA" +
385     "qxQAALcUAADMFAAA1hQAAN8UAADpFAAA+BQAAPsUAAACFQAADBUAAA8VAAAUFQAAHxUAACcVAAA1" +
386     "FQAAOhUAAD8VAABDFQAAWRUAAHAVAAB1FQAAfRUAAIgVAACbFQAAohUAALUVAADKFQAA0xUAAOEV" +
387     "AADtFQAA+hUAAP0VAAAPFgAAFhYAACIWAAAqFgAANhYAADsWAABLFgAAWBYAAGcWAABxFgAAhxYA" +
388     "AJkWAACsFgAAsRYAALgWAADBFgAAxBYAAMcWAAAEAAAABgAAAAcAAAAIAAAADQAAABwAAAAdAAAA" +
389     "HgAAAB8AAAAhAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC4AAAAv" +
390     "AAAAMAAAADcAAAA6AAAAPgAAAEAAAABBAAAABAAAAAAAAAAAAAAABgAAAAEAAAAAAAAABwAAAAIA" +
391     "AAAAAAAACAAAAAMAAAAAAAAACQAAAAMAAAD0DwAACgAAAAMAAAD8DwAACgAAAAMAAAAIEAAACwAA" +
392     "AAMAAAAUEAAADAAAAAMAAAAcEAAADAAAAAMAAAAkEAAADQAAAAQAAAAAAAAADgAAAAQAAAD0DwAA" +
393     "DwAAAAQAAAAsEAAAEAAAAAQAAAAUEAAAEwAAAAQAAAA0EAAAEQAAAAQAAABAEAAAEgAAAAQAAABI" +
394     "EAAAFgAAAAsAAAD0DwAAGAAAAAsAAABAEAAAGQAAAAsAAABIEAAAGgAAAAsAAABQEAAAGwAAAAsA" +
395     "AABYEAAAGAAAAAsAAABgEAAAGAAAAA4AAABgEAAAFAAAABAAAAAAAAAAFgAAABAAAAD0DwAAFwAA" +
396     "ABAAAAAsEAAAFQAAABEAAABoEAAAGAAAABEAAABAEAAAFgAAABUAAAD0DwAAFAAAABYAAAAAAAAA" +
397     "NwAAABcAAAAAAAAAOgAAABgAAAAAAAAAOwAAABgAAAD0DwAAPAAAABgAAABwEAAAPQAAABgAAABA" +
398     "EAAAPwAAABkAAAAkEAAACwADAAUAAAALAAQAMwAAAAsABAA0AAAACwADADgAAAALAAgAOQAAAAsA" +
399     "BAB1AAAACwAEAIMAAAAKACMAAgAAAAsAIAABAAAACwAhAAIAAAALACMAAgAAAAsABABHAAAACwAA" +
400     "AEkAAAALAAcASgAAAAsACABLAAAACwAJAEsAAAALAAcATAAAAAsAEgBNAAAACwAeAE4AAAALAA0A" +
401     "UAAAAAsAAQBTAAAACwAkAFUAAAALAAIAVgAAAAsAIgBXAAAACwAFAFgAAAALAAYAWAAAAAsAEgBZ" +
402     "AAAACwAUAFkAAAALABUAWQAAAAsAAwBaAAAACwAEAFoAAAALAAsAWwAAAAsAAwBeAAAACwAKAGEA" +
403     "AAALAAsAYwAAAAsADQBkAAAACwANAGUAAAALAAQAZwAAAAsABABoAAAACwAOAGsAAAALAA8AawAA" +
404     "AAsAEABrAAAACwAOAGwAAAALAA8AbAAAAAsAEABsAAAACwANAG4AAAALABYAbwAAAAsAFwBvAAAA" +
405     "CwALAHAAAAALAAsAcQAAAAsADAByAAAACwAMAHMAAAALAB8AdwAAAAsABAB4AAAACwAEAHkAAAAL" +
406     "AA0AegAAAAsAGQB7AAAACwAZAHwAAAALABkAfQAAAAsAGAB+AAAACwAZAH4AAAALABoAfgAAAAsA" +
407     "HQB/AAAACwAZAIAAAAALABoAgAAAAAsAGgCBAAAACwARAIQAAAALABIAhAAAAAsAEwCEAAAADAAg" +
408     "AAIAAAARACAAAgAAABEAGwBEAAAAEQAcAEQAAAARABgAfgAAAAsAAAARAAAADAAAAOgPAAAyAAAA" +
409     "7BgAAKYXAAC0GAAABAACAAIAAACADgAACAAAACIACgAaATUAcCAAABAAJwADAAEAAgAAAIYOAAAI" +
410     "AAAAIgAKABoBNQBwIAAAEAAnAAMAAQACAAAAiw4AAAgAAAAiAAoAGgE1AHAgAAAQACcAAwABAAIA" +
411     "AACQDgAACAAAACIACgAaATUAcCAAABAAJwADAAIAAAAAAJUOAAACAAAAElAPAAYABAACAAAAmg4A" +
412     "AAgAAAAiAAoAGgE1AHAgAAAQACcABAACAAIAAACjDgAACAAAACIACgAaATUAcCAAABAAJwACAAIA" +
413     "AgAAAKkOAAAHAAAAHwELAG4gBwAQAAoBDwEAAAYABAACAAAArg4AAAgAAAAiAAoAGgE1AHAgAAAQ" +
414     "ACcABgAEAAIAAAC3DgAACAAAACIACgAaATUAcCAAABAAJwAGAAQAAgAAAL4OAAAIAAAAIgAKABoB" +
415     "NQBwIAAAEAAnAAMAAQACAAAAxQ4AAAgAAAAiAAoAGgE1AHAgAAAQACcABAACAAIAAADKDgAACAAA" +
416     "ACIACgAaATUAcCAAABAAJwADAAEAAgAAANEOAAAIAAAAIgAKABoBNQBwIAAAEAAnAAQAAgAAAAAA" +
417     "1g4AAAQAAACbAAIChAEPAQQAAgAAAAAA2w4AAAYAAAASEKUAAgDAIIQBDwEDAAIAAAAAAOAOAAAC" +
418     "AAAAEgAPAAQAAgACAAAA5Q4AAAgAAAAiAAoAGgE1AHAgAAAQACcAAwABAAIAAADrDgAACAAAACIA" +
419     "CgAaATUAcCAAABAAJwADAAEAAgAAAPEOAAAIAAAAIgAKABoBNQBwIAAAEAAnAAQAAgACAAAA9w4A" +
420     "AAgAAAAiAAoAGgE1AHAgAAAQACcABQADAAIAAAD/DgAACAAAACIACgAaATUAcCAAABAAJwAEAAIA" +
421     "AgAAAAcPAAAIAAAAIgAKABoBNQBwIAAAEAAnAAMAAQACAAAADQ8AAAgAAAAiAAoAGgE1AHAgAAAQ" +
422     "ACcABAACAAIAAAATDwAACAAAACIACgAaATUAcCAAABAAJwADAAIAAwAAABkPAAAGAAAAIgALAHAw" +
423     "AgAQAhEAAgACAAIAAACpDgAABQAAAG4gJwAQAAwBEQEAAAQAAgACAAAAHg8AAAgAAAAiAAoAGgE1" +
424     "AHAgAAAQACcABAACAAIAAAAjDwAACAAAACIACgAaATUAcCAAABAAJwAEAAIAAgAAACgPAAAIAAAA" +
425     "IgAKABoBNQBwIAAAEAAnAAQAAQADAAAALQ8AABcAAAAiABEAcBA/AAAAGgE2AG4gQQAQAAwAUzEG" +
426     "AIYRbjBAABACDABuEEIAAAAMABEAAAAEAAIAAgAAADEPAAAIAAAAIgAKABoBNQBwIAAAEAAnAAUA" +
427     "AwACAAAANg8AAAgAAAAiAAoAGgE1AHAgAAAQACcABAACAAIAAAA8DwAACAAAACIACgAaATUAcCAA" +
428     "ABAAJwAFAAMAAgAAAEEPAAAIAAAAIgAKABoBNQBwIAAAEAAnAAUAAwACAAAARw8AAAgAAAAiAAoA" +
429     "GgE1AHAgAAAQACcABAACAAIAAABODwAACAAAACIACgAaATUAcCAAABAAJwADAAEAAgAAAFMPAAAI" +
430     "AAAAIgAKABoBNQBwIAAAEAAnAAYABAACAAAAWA8AAAgAAAAiAAoAGgE1AHAgAAAQACcABAACAAAA" +
431     "AABfDwAABAAAABYAAQC7IBAAAwABAAAAAABkDwAAAwAAAFMgBgAQAAAABAACAAAAAABpDwAABQAA" +
432     "ABYAAQCcAAIAEAAAAAYABAACAAAAbg8AAAgAAAAiAAoAGgE1AHAgAAAQACcABgAEAAIAAAB1DwAA" +
433     "CAAAACIACgAaATUAcCAAABAAJwAGAAQAAgAAAHwPAAAIAAAAIgAKABoBNQBwIAAAEAAnAAMAAQAC" +
434     "AAAAhA8AAAgAAAAiAAoAGgE1AHAgAAAQACcABAACAAIAAACJDwAACAAAACIACgAaATUAcCAAABAA" +
435     "JwAGAAQAAgAAAI8PAAAIAAAAIgAKABoBNQBwIAAAEAAnAAMAAQACAAAAlw8AAAgAAAAiAAoAGgE1" +
436     "AHAgAAAQACcABAACAAIAAACcDwAACAAAACIACgAaATUAcCAAABAAJwAGAAQAAgAAAKIPAAAIAAAA" +
437     "IgAKABoBNQBwIAAAEAAnAAQAAgAAAAAAqQ8AAAIAAAB9IBAABAACAAAAAACuDwAAAwAAABYAAAAQ" +
438     "AAAAAwADAAAAAACzDwAAAQAAABAAAAAFAAMAAAAAALkPAAAFAAAAFgAKAJ0AAAIQAAAABgAEAAAA" +
439     "AAC/DwAAAwAAAJsAAgQQAAAAAwABAAIAAADFDwAACAAAACIACgAaATUAcCAAABAAJwABAAAAAAAA" +
440     "AMoPAAAEAAAAEgBpAAQADgAEAAIAAwAAAM8PAAANAAAAFgAAAHAwAgACASIACgAaATUAcCAAABAA" +
441     "JwAAAAMAAwABAAAA1g8AAAYAAABwED4AAABaAQYADgAIAAYAAgAAAN4PAAAIAAAAIgAKABoBNQBw" +
442     "IAAAEAAnAKUBAWoOAI0BAA4AnAEADgCZAQAOACwBXQ4AtAEChgGHAQ4AsQEBRA4ACQEADgC3AQKG" +
443     "AYcBDgBkA11eSQ4AZwNdXkkOAJ8BAA4AogEBhAEOAJMBAA4AJAFdDgAoAV0OADwBXQ4AagGGAQ4A" +
444     "hQEBZw4AqAEBZw4ArgECZ4MBDgCrAQJngwEOANIBAWMOAIIBAXUOAH8CdW4OABgBYA4AVQFdDgBP" +
445     "AV0OAFIBXQ4AQwAOAF4BXQ4ARgJdbg4AYQFdDgBJAl1uDgBYAoMBdw4ATAFdDgDMAQAOALoBAlJT" +
446     "DgAcAV0OAJYBAA4AIAFdDgDCAQJDRg4AxQECQ0YOAHMEdUdVbg4AcAF1DgBtAnVuDgB8BHVHVW4O" +
447     "AHkBdQ4AdgJ1bg4AvQECUlMOADgBXQ4AQAFdDgAwAl1QDgA0Al1QDgAQAkNGDgCQAQAOAAwADjwA" +
448     "iQEBdQ5aABMBhAEOPC0AWwWDAXdJa2EOAAMAAAAJABIAEwAAAAEAAAAEAAAAAwAAAAQAAwAaAAAA" +
449     "AwAAAAQAAwAbAAAAAgAAAAQABAABAAAACwAAAAEAAAAOAAAAAgAAAAQAAwAEAAAABwADAAMAAwAB" +
450     "AAAAEAAAAAIAAAAQAAMAAgAAABAABAACAAAAEAALAAEAAAAUAAAAAQAAAAEAAAAFAAAABAADABoA" +
451     "AwADAAIoKQAIPGNsaW5pdD4ABjxpbml0PgACPjsAAUIABUJZVEVTAAFEAAFGAAFJAAJJSgAESUpJ" +
452     "TAADSUpKAAJJTAABSgACSkoAA0pKSQADSkpKAAJKTAADSkxJAAVKTElJSQABTAACTEQAAkxKAANM" +
453     "SkkAAkxMAANMTEkAA0xMSgADTExMAB1MZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOwAaTGRh" +
454     "bHZpay9hbm5vdGF0aW9uL1Rocm93czsAGExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOwARTGphdmEv" +
455     "bGFuZy9DbGFzczsAEUxqYXZhL2xhbmcvQ2xhc3M8ABZMamF2YS9sYW5nL0NvbXBhcmFibGU7ABZM" +
456     "amF2YS9sYW5nL0NvbXBhcmFibGU8ABFMamF2YS9sYW5nL0Vycm9yOwAQTGphdmEvbGFuZy9Mb25n" +
457     "OwASTGphdmEvbGFuZy9OdW1iZXI7ACFMamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsA" +
458     "EkxqYXZhL2xhbmcvT2JqZWN0OwAoTGphdmEvbGFuZy9SZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0" +
459     "aW9uOwASTGphdmEvbGFuZy9TdHJpbmc7ABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AB5MamF2" +
460     "YS9sYW5nL2NvbnN0YW50L0NvbnN0YWJsZTsAIUxqYXZhL2xhbmcvY29uc3RhbnQvQ29uc3RhbnRE" +
461     "ZXNjOwAoTGphdmEvbGFuZy9jb25zdGFudC9EeW5hbWljQ29uc3RhbnREZXNjOwAnTGphdmEvbGFu" +
462     "Zy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7ABZMamF2YS9tYXRoL0JpZ0ludGVnZXI7ABRM" +
463     "amF2YS91dGlsL09wdGlvbmFsOwAUTGphdmEvdXRpbC9PcHRpb25hbDwACUxvbmcuamF2YQAJTUFY" +
464     "X1ZBTFVFAAlNSU5fVkFMVUUAFk1ldGhvZCByZWRlZmluZWQgYXdheSEAIlJlZGVmaW5lZCBMb25n" +
465     "ISB2YWx1ZSAoYXMgZG91YmxlKT0AAVMABFNJWkUABFRZUEUAAVYAAlZKAAZWSklMSUkAAlZMAAFa" +
466     "AAJaTAACW0IAAltDAAFhAAthbm90aGVyTG9uZwAGYXBwZW5kAAFiAApiZWdpbkluZGV4AAhiaXRD" +
467     "b3VudAADYnVmAAlieXRlVmFsdWUAB2NvbXBhcmUACWNvbXBhcmVUbwAPY29tcGFyZVVuc2lnbmVk" +
468     "AAZkZWNvZGUAEWRlc2NyaWJlQ29uc3RhYmxlAAhkaXN0YW5jZQAOZGl2aWRlVW5zaWduZWQACGRp" +
469     "dmlkZW5kAAdkaXZpc29yAAtkb3VibGVWYWx1ZQAIZW5kSW5kZXgABmVxdWFscwAKZmxvYXRWYWx1" +
470     "ZQATZm9ybWF0VW5zaWduZWRMb25nMAAIZ2V0Q2hhcnMAB2dldExvbmcACGhhc2hDb2RlAA1oaWdo" +
471     "ZXN0T25lQml0AAFpAAVpbmRleAAIaW50VmFsdWUAAWwAA2xlbgAJbG9uZ1ZhbHVlAAZsb29rdXAA" +
472     "DGxvd2VzdE9uZUJpdAADbWF4AANtaW4AAm5tABRudW1iZXJPZkxlYWRpbmdaZXJvcwAVbnVtYmVy" +
473     "T2ZUcmFpbGluZ1plcm9zAANvYmoABm9mZnNldAAJcGFyc2VMb25nABFwYXJzZVVuc2lnbmVkTG9u" +
474     "ZwAFcmFkaXgAEXJlbWFpbmRlclVuc2lnbmVkABNyZXNvbHZlQ29uc3RhbnREZXNjAAdyZXZlcnNl" +
475     "AAxyZXZlcnNlQnl0ZXMACnJvdGF0ZUxlZnQAC3JvdGF0ZVJpZ2h0AAFzABBzZXJpYWxWZXJzaW9u" +
476     "VUlEAAVzaGlmdAAKc2hvcnRWYWx1ZQAGc2lnbnVtAApzdHJpbmdTaXplAANzdW0ADnRvQmluYXJ5" +
477     "U3RyaW5nAAt0b0hleFN0cmluZwANdG9PY3RhbFN0cmluZwAIdG9TdHJpbmcAFHRvVW5zaWduZWRC" +
478     "aWdJbnRlZ2VyABB0b1Vuc2lnbmVkU3RyaW5nABF0b1Vuc2lnbmVkU3RyaW5nMAADdmFsAAV2YWx1" +
479     "ZQAHdmFsdWVPZgABeAABeQCbAX5+RDh7ImJhY2tlbmQiOiJkZXgiLCJjb21waWxhdGlvbi1tb2Rl" +
480     "IjoiZGVidWciLCJoYXMtY2hlY2tzdW1zIjpmYWxzZSwibWluLWFwaSI6MSwic2hhLTEiOiJmZWE0" +
481     "ZmY0ZDg1MWIxMThhZWFjZjMxZDRkODJmZmJjYmNiZWE0ZGVmIiwidmVyc2lvbiI6IjguMi44LWRl" +
482     "diJ9AAIGAYMBHAEYDQIFAYMBHAQXABcxFy0XAwIGAYMBHAEYDwIFAYMBHAMXIBckFwMCBQGDARwG" +
483     "FyUXIhckFwMXKxcsBgEvDgAZARkBGQEZARkBGgYSAYiABIAcAYGABMQcAYGABJgcAQmsDwIJwA8D" +
484     "CaAQAQnIEgIJ4BcECOAcAQjAEAEI4BABCegSAQmoEwEJiBMCCaARAQmAGAMJsBgBCcwYAQnsGAEJ" +
485     "4BEBCfgRAQmMGQEJrBkBCcwZAQnsGQEJjBoBCawaAQnMGgMJ7BoBCYAbAQmYGwEJrBsCCZQSAQio" +
486     "EgEJyBsBCeAUAQmAFQEJoBUCCYAWAQmgFgEKoBcBCcAWAQngFgEIgBcBCagUAQnoEwEJiBQFAcwO" +
487     "AgHgDwHBIIAQAwHAFwIB7A4BAawOAQGMDwcBgBEDAcARAQGYGA0ByBMBwSDEFAUB4BsHAcAVBAQI" +
488     "BgAGAARAAAAAAAAAAAEAAABlFwAAAQAAAG4XAAABAAAAfRcAAAEAAACGFwAAAQAAAJMXAADkGAAA" +
489     "AQAAAAwAAAAAAAAABAAAANwYAAADAAAAxBgAAAoAAADEGAAACwAAAMwYAAAgAAAAxBgAACEAAADE" +
490     "GAAAIgAAAMQYAAAjAAAAxBgAACQAAADEGAAAJQAAAMQYAAAoAAAA1BgAADwAAADEGAAAPQAAAMQY" +
491     "AAARAAAAAAAAAAEAAAAAAAAAAQAAAIgAAABwAAAAAgAAABwAAACQAgAAAwAAACUAAAAAAwAABAAA" +
492     "AAcAAAC8BAAABQAAAEMAAAD0BAAABgAAAAEAAAAMBwAAASAAAD0AAAAsBwAAAyAAADwAAACADgAA" +
493     "ARAAABAAAADoDwAAAiAAAIgAAAB+EAAABCAAAAUAAABlFwAAACAAAAEAAACmFwAABSAAAAEAAAC0" +
494     "GAAAAxAAAAYAAADAGAAABiAAAAEAAADsGAAAABAAAAEAAABkGQAA"
495     );
496 
497   static class FuncCmp implements LongPredicate {
498     final String name;
499     final LongPredicate p;
FuncCmp(String name, LongPredicate p)500     public FuncCmp(String name, LongPredicate p) {
501       this.name = name;
502       this.p = p;
503     }
504 
test(long l)505     public boolean test(long l) {
506       return p.test(l);
507     }
508   }
l2l(String name, final LongUnaryOperator a, final LongUnaryOperator b)509   static FuncCmp l2l(String name, final LongUnaryOperator a, final LongUnaryOperator b) {
510     return new FuncCmp(name, (v) -> a.applyAsLong(v) == b.applyAsLong(v));
511   }
l2i(String name, final LongToIntFunction a, final LongToIntFunction b)512   static FuncCmp l2i(String name, final LongToIntFunction a, final LongToIntFunction b) {
513     return new FuncCmp(name, (v) -> a.applyAsInt(v) == b.applyAsInt(v));
514   }
515 
516   /** Interface for a long, int -> long function. */
applyToLongInt(long a, int b)517   static interface LI2IFunction { public long applyToLongInt(long a, int b); }
518 
li2l(String name, final Random r, final LI2IFunction a, final LI2IFunction b)519   static FuncCmp li2l(String name, final Random r, final LI2IFunction a, final LI2IFunction b) {
520     return new FuncCmp(name, new LongPredicate() {
521       public boolean test(long v) {
522         int i = r.nextInt();
523         return a.applyToLongInt(v, i) == b.applyToLongInt(v, i);
524       }
525     });
526   }
527 
528   public static void main(String[] args) {
529     doTest(10000);
530   }
531 
532   public static void doTest(int iters) {
533     // Just transform immediately.
534     doCommonClassRedefinition(Long.class, CLASS_BYTES, DEX_BYTES);
535     final Random r = new Random();
536     FuncCmp[] comps = new FuncCmp[] {
537       l2l("highestOneBit", Long::highestOneBit, RedefinedLongIntrinsics::highestOneBit),
538       l2l("lowestOneBit", Long::lowestOneBit, RedefinedLongIntrinsics::lowestOneBit),
539       l2i("numberOfLeadingZeros",
540           Long::numberOfLeadingZeros,
541           RedefinedLongIntrinsics::numberOfLeadingZeros),
542       l2i("numberOfTrailingZeros",
543           Long::numberOfTrailingZeros,
544           RedefinedLongIntrinsics::numberOfTrailingZeros),
545       l2i("bitCount", Long::bitCount, RedefinedLongIntrinsics::bitCount),
546       li2l("rotateLeft", r, Long::rotateLeft, RedefinedLongIntrinsics::rotateLeft),
547       li2l("rotateRight", r, Long::rotateRight, RedefinedLongIntrinsics::rotateRight),
548       l2l("reverse", Long::reverse, RedefinedLongIntrinsics::reverse),
549       l2i("signum", Long::signum, RedefinedLongIntrinsics::signum),
550       l2l("reverseBytes", Long::reverseBytes, RedefinedLongIntrinsics::reverseBytes),
551     };
552     for (FuncCmp f : comps) {
553       // Just actually use ints so we can cast them back int the tests to print them (since we
554       // deleted a bunch of the Long methods needed for printing longs)!
555       int failures = (int)r.ints(iters)
556                            .mapToLong((v) -> (long)v)
557                            .filter(f.negate()) // Get all the test cases that failed.
558                            .count();
559       if (failures != 0) {
560         double percent = 100.0d*((double)failures/(double)iters);
561         System.out.println("for intrinsic " + f.name + " " + failures + "/" + iters
562             + " (" + Double.toString(percent) + "%) tests failed!");
563       }
564     }
565     System.out.println("Finished!");
566   }
567 }
568