From 69ad0e657595da6d53114d4893098eccaecff03d Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Tue, 7 May 2024 21:29:13 +0200 Subject: [PATCH 01/10] Initial --- .../classes/java/io/FileInputStream.java | 60 ++++++ .../classes/java/io/FileOutputStream.java | 54 ++++++ .../classes/java/io/RandomAccessFile.java | 112 +++++++++++ .../jdk/internal/event/FileReadEvent.java | 56 ++++++ .../jdk/internal/event/FileWriteEvent.java} | 36 +++- .../jdk/internal/event/JFRTracing.java | 52 +++++ .../jdk/internal/event/ThrowableTracer.java | 9 +- .../classes/sun/nio/ch/FileChannelImpl.java | 177 ++++++++++++++++- .../classes/jdk/jfr/events/FileReadEvent.java | 12 +- .../jdk/jfr/events/FileWriteEvent.java | 13 +- .../jdk/jfr/internal/MirrorEvents.java | 6 +- .../FileChannelImplInstrumentor.java | 183 ------------------ .../FileInputStreamInstrumentor.java | 119 ------------ .../FileOutputStreamInstrumentor.java | 107 ---------- .../jfr/internal/instrument/JDKEvents.java | 15 +- .../RandomAccessFileInstrumentor.java | 183 ------------------ .../jfr/jvm/TestGetEventWriterPackage.java | 6 +- .../startupargs/TestRetransformUsingLog.java | 12 +- 18 files changed, 564 insertions(+), 648 deletions(-) create mode 100644 src/java.base/share/classes/jdk/internal/event/FileReadEvent.java rename src/{jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java => java.base/share/classes/jdk/internal/event/FileWriteEvent.java} (59%) create mode 100644 src/java.base/share/classes/jdk/internal/event/JFRTracing.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileChannelImplInstrumentor.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileInputStreamInstrumentor.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileOutputStreamInstrumentor.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/RandomAccessFileInstrumentor.java diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index 1ed2eb05d37e4..db6ce897ea187 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -28,6 +28,7 @@ import java.nio.channels.FileChannel; import java.util.Arrays; import jdk.internal.util.ArraysSupport; +import jdk.internal.event.FileReadEvent; import sun.nio.ch.FileChannelImpl; /** @@ -59,6 +60,9 @@ public class FileInputStream extends InputStream { private static final int DEFAULT_BUFFER_SIZE = 8192; + // Flag that determines if file reads should be traced by JFR + static boolean jfrTracing; + /* File Descriptor - handle to the open file */ private final FileDescriptor fd; @@ -222,6 +226,9 @@ private void open(String name) throws FileNotFoundException { */ @Override public int read() throws IOException { + if (jfrTracing) { + return traceRead0(); + } return read0(); } @@ -249,6 +256,9 @@ public int read() throws IOException { */ @Override public int read(byte[] b) throws IOException { + if (jfrTracing) { + return traceReadBytes(b, 0, b.length); + } return readBytes(b, 0, b.length); } @@ -268,6 +278,9 @@ public int read(byte[] b) throws IOException { */ @Override public int read(byte[] b, int off, int len) throws IOException { + if (jfrTracing) { + return traceReadBytes(b, off, len); + } return readBytes(b, off, len); } @@ -547,4 +560,51 @@ public FileChannel getChannel() { static { initIDs(); } + + private int traceRead0() throws IOException { + if (!FileReadEvent.enabled()) { + return read0(); + } + int result = 0; + boolean endOfFile = false; + long bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + result = read0(); + if (result < 0) { + endOfFile = true; + } else { + bytesRead = 1; + } + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); + } + } + return result; + } + + private int traceReadBytes(byte b[], int off, int len) throws IOException { + if (!FileReadEvent.enabled()) { + return readBytes(b, off, len); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readBytes(b, off, len); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } } diff --git a/src/java.base/share/classes/java/io/FileOutputStream.java b/src/java.base/share/classes/java/io/FileOutputStream.java index 2b017080a11a0..96d1000ad3bc3 100644 --- a/src/java.base/share/classes/java/io/FileOutputStream.java +++ b/src/java.base/share/classes/java/io/FileOutputStream.java @@ -28,6 +28,7 @@ import java.nio.channels.FileChannel; import jdk.internal.access.SharedSecrets; import jdk.internal.access.JavaIOFileDescriptorAccess; +import jdk.internal.event.FileWriteEvent; import sun.nio.ch.FileChannelImpl; @@ -68,6 +69,9 @@ public class FileOutputStream extends OutputStream private static final JavaIOFileDescriptorAccess FD_ACCESS = SharedSecrets.getJavaIOFileDescriptorAccess(); + // Flag that determines if file writes should be traced by JFR + static boolean jfrTracing; + /** * The system dependent file descriptor. */ @@ -307,6 +311,10 @@ private void open(String name, boolean append) throws FileNotFoundException { @Override public void write(int b) throws IOException { boolean append = FD_ACCESS.getAppend(fd); + if (jfrTracing) { + traceWrite(b, append); + return; + } write(b, append); } @@ -332,6 +340,10 @@ private native void writeBytes(byte[] b, int off, int len, boolean append) @Override public void write(byte[] b) throws IOException { boolean append = FD_ACCESS.getAppend(fd); + if (jfrTracing) { + traceWriteBytes(b, 0, b.length, append); + return; + } writeBytes(b, 0, b.length, append); } @@ -348,6 +360,10 @@ public void write(byte[] b) throws IOException { @Override public void write(byte[] b, int off, int len) throws IOException { boolean append = FD_ACCESS.getAppend(fd); + if (jfrTracing) { + traceWriteBytes(b, off, len, append); + return; + } writeBytes(b, off, len, append); } @@ -461,4 +477,42 @@ public FileChannel getChannel() { static { initIDs(); } + + private void traceWrite(int b, boolean append) throws IOException { + if (!FileWriteEvent.enabled()) { + write(b, append); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + write(b, append); + bytesWritten = 1; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + + private void traceWriteBytes(byte b[], int off, int len, boolean append) throws IOException { + if (!FileWriteEvent.enabled()) { + writeBytes(b, off, len, append); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + writeBytes(b, off, len, append); + bytesWritten = len; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } } diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index ee7b90ea71ab1..c78826045df02 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -31,6 +31,8 @@ import jdk.internal.access.SharedSecrets; import jdk.internal.misc.Blocker; import jdk.internal.util.ByteArray; +import jdk.internal.event.FileReadEvent; +import jdk.internal.event.FileWriteEvent; import sun.nio.ch.FileChannelImpl; @@ -68,6 +70,9 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable { private static final int O_DSYNC = 8; private static final int O_TEMPORARY = 16; + // Flag that determines if file reads/writes should be traced by JFR + private static boolean jfrTracing; + private final FileDescriptor fd; private final boolean rw; @@ -376,6 +381,9 @@ private void open(String name, int mode) throws FileNotFoundException { * end-of-file has been reached. */ public int read() throws IOException { + if (jfrTracing) { + return traceRead0(); + } return read0(); } @@ -389,6 +397,9 @@ public int read() throws IOException { * @throws IOException If an I/O error has occurred. */ private int readBytes(byte[] b, int off, int len) throws IOException { + if (jfrTracing) { + return traceReadBytes0(b, off, len); + } return readBytes0(b, off, len); } @@ -537,6 +548,14 @@ public int skipBytes(int n) throws IOException { * @throws IOException if an I/O error occurs. */ public void write(int b) throws IOException { + if (jfrTracing) { + traceWriteImpl(b); + return; + } + writeImpl(b); + } + + private void writeImpl(int b) throws IOException { boolean attempted = Blocker.begin(sync); try { write0(b); @@ -556,6 +575,14 @@ public void write(int b) throws IOException { * @throws IOException If an I/O error has occurred. */ private void writeBytes(byte[] b, int off, int len) throws IOException { + if (jfrTracing) { + traceWriteBytesImpl(b, off, len); + return; + } + writeBytesImpl(b, off, len); + } + + private void writeBytesImpl(byte[] b, int off, int len) throws IOException { boolean attempted = Blocker.begin(sync); try { writeBytes0(b, off, len); @@ -1198,6 +1225,91 @@ public final void writeUTF(String str) throws IOException { DataOutputStream.writeUTF(str, this); } + private int traceRead0() throws IOException { + if (!FileReadEvent.enabled()) { + return read0(); + } + int result = 0; + long bytesRead = 0; + boolean endOfFile = false; + long start = 0; + try { + start = FileReadEvent.timestamp(); + result = read0(); + if (result < 0) { + endOfFile = true; + } else { + bytesRead = 1; + } + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); + } + } + return result; + } + + private int traceReadBytes0(byte b[], int off, int len) throws IOException { + if (!FileReadEvent.enabled()) { + return readBytes0(b, off, len); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readBytes0(b, off, len); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + + private void traceWriteImpl(int b) throws IOException { + if (!FileWriteEvent.enabled()) { + writeImpl(b); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + writeImpl(b); + bytesWritten = 1; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + + private void traceWriteBytesImpl(byte b[], int off, int len) throws IOException { + if (!FileWriteEvent.enabled()) { + writeBytesImpl(b, off, len); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + writeBytesImpl(b, off, len); + bytesWritten = len; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + private static native void initIDs(); static { diff --git a/src/java.base/share/classes/jdk/internal/event/FileReadEvent.java b/src/java.base/share/classes/jdk/internal/event/FileReadEvent.java new file mode 100644 index 0000000000000..34ff4e9d4ed3d --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/event/FileReadEvent.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.event; + +/** + * Event recording file reads. + */ +public final class FileReadEvent extends Event { + + // The order of these fields must be the same as the parameters in + // commit(..., String, long, boolean) + public String path; + public long bytesRead; + public boolean endOfFile; + + public static boolean enabled() { + // Generated by JFR + return false; + } + + public static long timestamp() { + // Generated by JFR + return 0L; + } + + public static boolean shouldCommit(long duration) { + // Generated by JFR + return false; + } + + public static void commit(long start, long duration, String path, long bytesRead, boolean endOfFile) { + // Generated by JFR + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java b/src/java.base/share/classes/jdk/internal/event/FileWriteEvent.java similarity index 59% rename from src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java rename to src/java.base/share/classes/jdk/internal/event/FileWriteEvent.java index 7d829f690767e..7a39f93b991a1 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java +++ b/src/java.base/share/classes/jdk/internal/event/FileWriteEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,12 +22,34 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ +package jdk.internal.event; -package jdk.jfr.events; -import jdk.jfr.internal.JVMSupport; -import jdk.jfr.internal.event.EventConfiguration; +/** + * Event recording file writes. + */ +public final class FileWriteEvent extends Event { + + // The order of these fields must be the same as the parameters in + // commit(..., String, long) + public String path; + public long bytesWritten; + + public static boolean enabled() { + // Generated by JFR + return false; + } + + public static long timestamp() { + // Generated by JFR + return 0L; + } + + public static boolean shouldCommit(long duration) { + // Generated by JFR + return false; + } -public final class EventConfigurations { - public static final EventConfiguration FILE_READ = JVMSupport.getConfiguration(FileReadEvent.class); - public static final EventConfiguration FILE_WRITE = JVMSupport.getConfiguration(FileWriteEvent.class); + public static void commit(long start, long duration, String path, long bytesWritten) { + // Generated by JFR + } } diff --git a/src/java.base/share/classes/jdk/internal/event/JFRTracing.java b/src/java.base/share/classes/jdk/internal/event/JFRTracing.java new file mode 100644 index 0000000000000..8e1e4b16913c0 --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/event/JFRTracing.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.event; + +import sun.nio.ch.FileChannelImpl; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.RandomAccessFile; +import java.lang.Throwable; +import java.lang.reflect.Field; + +/** + * Helper class for enabling JFR tracing. + */ +public final class JFRTracing { + + public static void enable() throws NoSuchFieldException, IllegalAccessException { + enable(Throwable.class); + enable(FileInputStream.class); + enable(FileOutputStream.class); + enable(FileChannelImpl.class); + enable(RandomAccessFile.class); + } + + private static void enable(Class clazz) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField("jfrTracing"); + field.setAccessible(true); + field.setBoolean(null, true); + } +} diff --git a/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java b/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java index 151312f111fc1..f7076b44e909b 100644 --- a/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java +++ b/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ */ package jdk.internal.event; -import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicLong; /** @@ -34,12 +33,6 @@ public final class ThrowableTracer { private static final AtomicLong numThrowables = new AtomicLong(); - public static void enable() throws NoSuchFieldException, IllegalAccessException { - Field field = Throwable.class.getDeclaredField("jfrTracing"); - field.setAccessible(true); - field.setBoolean(null, true); - } - public static void traceError(Class clazz, String message) { if (OutOfMemoryError.class.isAssignableFrom(clazz)) { return; diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index 0b72ee6a7c2e2..df1186a67e6a9 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -60,7 +60,8 @@ import jdk.internal.misc.VM.BufferPool; import jdk.internal.ref.Cleaner; import jdk.internal.ref.CleanerFactory; - +import jdk.internal.event.FileReadEvent; +import jdk.internal.event.FileWriteEvent; import jdk.internal.access.foreign.UnmapperProxy; public class FileChannelImpl @@ -73,6 +74,9 @@ public class FileChannelImpl // Used to make native read and write calls private static final FileDispatcher nd = new FileDispatcherImpl(); + // Flag that determines if file reads/writes should be traced by JFR + private static boolean jfrTracing; + // File descriptor private final FileDescriptor fd; @@ -220,6 +224,13 @@ protected void implCloseChannel() throws IOException { @Override public int read(ByteBuffer dst) throws IOException { + if (jfrTracing) { + return traceReadImpl(dst); + } + return readImpl(dst); + } + + private int readImpl(ByteBuffer dst) throws IOException { ensureOpen(); if (!readable) throw new NonReadableChannelException(); @@ -251,7 +262,14 @@ public int read(ByteBuffer dst) throws IOException { } @Override - public long read(ByteBuffer[] dsts, int offset, int length) + public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { + if (jfrTracing) { + return traceReadImpl(dsts, offset, length); + } + return readImpl(dsts, offset, length); + } + + private long readImpl(ByteBuffer[] dsts, int offset, int length) throws IOException { Objects.checkFromIndexSize(offset, length, dsts.length); @@ -288,6 +306,13 @@ public long read(ByteBuffer[] dsts, int offset, int length) @Override public int write(ByteBuffer src) throws IOException { + if (jfrTracing) { + return traceWriteImpl(src); + } + return writeImpl(src); + } + + private int writeImpl(ByteBuffer src) throws IOException { ensureOpen(); if (!writable) throw new NonWritableChannelException(); @@ -320,8 +345,14 @@ public int write(ByteBuffer src) throws IOException { } @Override - public long write(ByteBuffer[] srcs, int offset, int length) - throws IOException + public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { + if (jfrTracing) { + return traceWriteImpl(srcs, offset, length); + } + return writeImpl(srcs, offset, length); + } + + private long writeImpl(ByteBuffer[] srcs, int offset, int length) throws IOException { Objects.checkFromIndexSize(offset, length, srcs.length); ensureOpen(); @@ -1028,6 +1059,13 @@ public long transferFrom(ReadableByteChannel src, long position, long count) @Override public int read(ByteBuffer dst, long position) throws IOException { + if (jfrTracing) { + return traceReadImpl(dst, position); + } + return readImpl(dst, position); + } + + private int readImpl(ByteBuffer dst, long position) throws IOException { if (dst == null) throw new NullPointerException(); if (position < 0) @@ -1074,6 +1112,13 @@ private int readInternal(ByteBuffer dst, long position) throws IOException { @Override public int write(ByteBuffer src, long position) throws IOException { + if (jfrTracing) { + return traceWriteImpl(src, position); + } + return writeImpl(src, position); + } + + private int writeImpl(ByteBuffer src, long position) throws IOException { if (src == null) throw new NullPointerException(); if (position < 0) @@ -1617,4 +1662,128 @@ void release(FileLockImpl fli) throws IOException { assert fileLockTable != null; fileLockTable.remove(fli); } + + private int traceReadImpl(ByteBuffer dst) throws IOException { + if (!FileReadEvent.enabled()) { + return readImpl(dst); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readImpl(dst); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + + private int traceReadImpl(ByteBuffer dst, long position) throws IOException { + if (!FileReadEvent.enabled()) { + return readImpl(dst, position); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readImpl(dst, position); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + + private long traceReadImpl(ByteBuffer[] dsts, int offset, int length) throws IOException { + if (!FileReadEvent.enabled()) { + return readImpl(dsts, offset, length); + } + long bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readImpl(dsts, offset, length); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + + private int traceWriteImpl(ByteBuffer src) throws IOException { + if (!FileWriteEvent.enabled()) { + return writeImpl(src); + } + int bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = writeImpl(src); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } + + private int traceWriteImpl(ByteBuffer src, long position) throws IOException { + if (!FileWriteEvent.enabled()) { + return writeImpl(src, position); + } + + int bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = writeImpl(src, position); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } + + private long traceWriteImpl(ByteBuffer[] srcs, int offset, int length) throws IOException { + if (!FileWriteEvent.enabled()) { + return writeImpl(srcs, offset, length); + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = writeImpl(srcs, offset, length); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/FileReadEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/FileReadEvent.java index 76daa39b57136..84886d2493a54 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/FileReadEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/FileReadEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,15 +31,14 @@ import jdk.jfr.DataAmount; import jdk.jfr.Name; import jdk.jfr.internal.Type; +import jdk.jfr.internal.MirrorEvent; @Name(Type.EVENT_NAME_PREFIX + "FileRead") @Label("File Read") @Category("Java Application") @Description("Reading data from a file") -public final class FileReadEvent extends AbstractJDKEvent { - - // The order of these fields must be the same as the parameters in - // commit(..., String, long, boolean) +@StackFilter({"java.io.FileInputStream", "java.io.RandomAccessFile", "sun.nio.ch.FileChannelImpl"}) +public final class FileReadEvent extends MirrorEvent { @Label("Path") @Description("Full path of the file, or N/A if a file descriptor was used to create the stream, for example System.in") @@ -54,7 +53,4 @@ public final class FileReadEvent extends AbstractJDKEvent { @Description("If end of file was reached") public boolean endOfFile; - public static void commit(long start, long duration, String path, long bytesRead, boolean endOfFile) { - // Generated - } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/FileWriteEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/FileWriteEvent.java index 508c4eb07cc7e..990f1845168a5 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/FileWriteEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/FileWriteEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,15 +31,14 @@ import jdk.jfr.DataAmount; import jdk.jfr.Name; import jdk.jfr.internal.Type; +import jdk.jfr.internal.MirrorEvent; @Name(Type.EVENT_NAME_PREFIX + "FileWrite") @Label("File Write") @Category("Java Application") @Description("Writing data to a file") -public final class FileWriteEvent extends AbstractJDKEvent { - - // The order of these fields must be the same as the parameters in - // commit(..., String, long) +@StackFilter({"java.io.FileOutputStream", "java.io.RandomAccessFile", "sun.nio.ch.FileChannelImpl"}) +public final class FileWriteEvent extends MirrorEvent { @Label("Path") @Description("Full path of the file, or N/A if a file descriptor was used to create the stream, for example System.out and System.err") @@ -49,8 +48,4 @@ public final class FileWriteEvent extends AbstractJDKEvent { @Description("Number of bytes written to the file") @DataAmount public long bytesWritten; - - public static void commit(long start, long duration, String path, long bytesWritten) { - // Generated - } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java index 8ae1f3b031fdc..35eadff40d129 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,8 @@ import jdk.jfr.events.ExceptionStatisticsEvent; import jdk.jfr.events.ExceptionThrownEvent; import jdk.jfr.events.FileForceEvent; +import jdk.jfr.events.FileReadEvent; +import jdk.jfr.events.FileWriteEvent; import jdk.jfr.events.ProcessStartEvent; import jdk.jfr.events.SecurityPropertyModificationEvent; import jdk.jfr.events.SecurityProviderServiceEvent; @@ -57,6 +59,8 @@ final class MirrorEvents { static { register("jdk.internal.event.DeserializationEvent", DeserializationEvent.class); register("jdk.internal.event.FileForceEvent", FileForceEvent.class); + register("jdk.internal.event.FileReadEvent", FileReadEvent.class); + register("jdk.internal.event.FileWriteEvent", FileWriteEvent.class); register("jdk.internal.event.ProcessStartEvent", ProcessStartEvent.class); register("jdk.internal.event.SecurityPropertyModificationEvent", SecurityPropertyModificationEvent.class); register("jdk.internal.event.SecurityProviderServiceEvent", SecurityProviderServiceEvent.class); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileChannelImplInstrumentor.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileChannelImplInstrumentor.java deleted file mode 100644 index 5a795395c72c0..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileChannelImplInstrumentor.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.IOException; -import java.nio.ByteBuffer; - -import jdk.jfr.events.FileForceEvent; -import jdk.jfr.events.FileReadEvent; -import jdk.jfr.events.FileWriteEvent; -import jdk.jfr.internal.event.EventConfiguration; -import jdk.jfr.events.EventConfigurations; - -/** - * See {@link JITracer} for an explanation of this code. - */ -@JIInstrumentationTarget("sun.nio.ch.FileChannelImpl") -final class FileChannelImplInstrumentor { - - private FileChannelImplInstrumentor() { - } - - private String path; - - @JIInstrumentationMethod - public int read(ByteBuffer dst) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(dst); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(dst); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public int read(ByteBuffer dst, long position) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(dst, position); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(dst, position); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(dsts, offset, length); - } - long bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(dsts, offset, length); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public int write(ByteBuffer src) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - return write(src); - } - int bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesWritten = write(src); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } - - @JIInstrumentationMethod - public int write(ByteBuffer src, long position) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - return write(src, position); - } - - int bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesWritten = write(src, position); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } - - @JIInstrumentationMethod - public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - return write(srcs, offset, length); - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesWritten = write(srcs, offset, length); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileInputStreamInstrumentor.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileInputStreamInstrumentor.java deleted file mode 100644 index 1d1ccb3bcb232..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileInputStreamInstrumentor.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.IOException; - -import jdk.jfr.events.EventConfigurations; -import jdk.jfr.events.FileReadEvent; -import jdk.jfr.internal.event.EventConfiguration; - -/** - * See {@link JITracer} for an explanation of this code. - */ -@JIInstrumentationTarget("java.io.FileInputStream") -final class FileInputStreamInstrumentor { - - private FileInputStreamInstrumentor() { - } - - private String path; - - @JIInstrumentationMethod - public int read() throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(); - } - int result = 0; - boolean endOfFile = false; - long bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - result = read(); - if (result < 0) { - endOfFile = true; - } else { - bytesRead = 1; - } - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); - } - } - return result; - } - - @JIInstrumentationMethod - public int read(byte b[]) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(b); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(b); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public int read(byte b[], int off, int len) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(b, off, len); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(b, off, len); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileOutputStreamInstrumentor.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileOutputStreamInstrumentor.java deleted file mode 100644 index 2e9e750df9d8a..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/FileOutputStreamInstrumentor.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.IOException; - -import jdk.jfr.events.FileWriteEvent; -import jdk.jfr.internal.event.EventConfiguration; -import jdk.jfr.events.EventConfigurations; - -/** - * See {@link JITracer} for an explanation of this code. - */ -@JIInstrumentationTarget("java.io.FileOutputStream") -final class FileOutputStreamInstrumentor { - - private FileOutputStreamInstrumentor() { - } - - private String path; - - @JIInstrumentationMethod - public void write(int b) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b); - bytesWritten = 1; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - @JIInstrumentationMethod - public void write(byte b[]) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b); - bytesWritten = b.length; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - @JIInstrumentationMethod - public void write(byte b[], int off, int len) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b, off, len); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b, off, len); - bytesWritten = len; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java index fb981c42cae46..09f811b6a0f2a 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import java.util.Properties; import jdk.internal.access.SharedSecrets; +import jdk.internal.event.JFRTracing; import jdk.internal.event.ThrowableTracer; import jdk.jfr.Event; import jdk.jfr.events.ActiveRecordingEvent; @@ -41,8 +42,6 @@ import jdk.jfr.events.ContainerMemoryUsageEvent; import jdk.jfr.events.DirectBufferStatisticsEvent; import jdk.jfr.events.FileForceEvent; -import jdk.jfr.events.FileReadEvent; -import jdk.jfr.events.FileWriteEvent; import jdk.jfr.events.InitialSecurityPropertyEvent; import jdk.jfr.internal.JVM; @@ -57,8 +56,6 @@ public final class JDKEvents { private static final Class[] eventClasses = { - FileReadEvent.class, - FileWriteEvent.class, ActiveSettingEvent.class, ActiveRecordingEvent.class, // jdk.internal.event.* classes need their mirror @@ -68,6 +65,8 @@ public final class JDKEvents { jdk.internal.event.ExceptionStatisticsEvent.class, jdk.internal.event.ExceptionThrownEvent.class, jdk.internal.event.FileForceEvent.class, + jdk.internal.event.FileReadEvent.class, + jdk.internal.event.FileWriteEvent.class, jdk.internal.event.ProcessStartEvent.class, jdk.internal.event.SecurityPropertyModificationEvent.class, jdk.internal.event.SecurityProviderServiceEvent.class, @@ -88,10 +87,6 @@ public final class JDKEvents { // This is a list of the classes with instrumentation code that should be applied. private static final Class[] instrumentationClasses = new Class[] { - FileInputStreamInstrumentor.class, - FileOutputStreamInstrumentor.class, - RandomAccessFileInstrumentor.class, - FileChannelImplInstrumentor.class }; private static final Class[] targetClasses = new Class[instrumentationClasses.length]; @@ -118,7 +113,7 @@ public static synchronized void initialize() { PeriodicEvents.addJDKEvent(InitialSecurityPropertyEvent.class, emitInitialSecurityProperties); initializeContainerEvents(); - ThrowableTracer.enable(); + JFRTracing.enable(); initializationTriggered = true; } } catch (Exception e) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/RandomAccessFileInstrumentor.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/RandomAccessFileInstrumentor.java deleted file mode 100644 index 128859358d84b..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/RandomAccessFileInstrumentor.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.IOException; - -import jdk.jfr.events.FileReadEvent; -import jdk.jfr.events.FileWriteEvent; -import jdk.jfr.internal.event.EventConfiguration; -import jdk.jfr.events.EventConfigurations; - -/** - * See {@link JITracer} for an explanation of this code. - */ -@JIInstrumentationTarget("java.io.RandomAccessFile") -final class RandomAccessFileInstrumentor { - - private RandomAccessFileInstrumentor() { - } - - private String path; - - @JIInstrumentationMethod - public int read() throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(); - } - int result = 0; - long bytesRead = 0; - boolean endOfFile = false; - long start = 0; - try { - start = EventConfiguration.timestamp(); - result = read(); - if (result < 0) { - endOfFile = true; - } else { - bytesRead = 1; - } - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); - } - } - return result; - } - - @JIInstrumentationMethod - public int read(byte b[]) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(b); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(b); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public int read(byte b[], int off, int len) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_READ; - if (!eventConfiguration.isEnabled()) { - return read(b, off, len); - } - int bytesRead = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - bytesRead = read(b, off, len); - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - @JIInstrumentationMethod - public void write(int b) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b); - bytesWritten = 1; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - @JIInstrumentationMethod - public void write(byte b[]) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b); - bytesWritten = b.length; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - @JIInstrumentationMethod - public void write(byte b[], int off, int len) throws IOException { - EventConfiguration eventConfiguration = EventConfigurations.FILE_WRITE; - if (!eventConfiguration.isEnabled()) { - write(b, off, len); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = EventConfiguration.timestamp(); - write(b, off, len); - bytesWritten = len; - } finally { - long duration = EventConfiguration.timestamp() - start; - if (eventConfiguration.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } -} diff --git a/test/jdk/jdk/jfr/jvm/TestGetEventWriterPackage.java b/test/jdk/jdk/jfr/jvm/TestGetEventWriterPackage.java index 95a112f5d7835..065458d4ac778 100644 --- a/test/jdk/jdk/jfr/jvm/TestGetEventWriterPackage.java +++ b/test/jdk/jdk/jfr/jvm/TestGetEventWriterPackage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,13 +46,13 @@ static class PackageUnlockEvent extends Event { public static void main(String... args) throws Throwable { // --add-opens jdk.jfr/jdk.jfr.events=ALL-UNNAMED gives access to // the FileReadEvent class in the jdk.jfr module. - // When JFR is initialized the FileReadEvent is registered and an EventConfiguration object + // When JFR is initialized the DirectBufferStatisticsEvent is registered and an EventConfiguration object // assigned to its static field eventConfiguration try (Recording r = new Recording()) { r.start(); } // The tests gets the EventConfiguration object from the class - Classc = Class.forName("jdk.jfr.events.FileReadEvent"); + Classc = Class.forName("jdk.jfr.events.DirectBufferStatisticsEvent"); Field f = c.getDeclaredField("eventConfiguration"); f.setAccessible(true); Object o = f.get(null); diff --git a/test/jdk/jdk/jfr/startupargs/TestRetransformUsingLog.java b/test/jdk/jdk/jfr/startupargs/TestRetransformUsingLog.java index 8c8703dc9e697..186a87a12c2d2 100644 --- a/test/jdk/jdk/jfr/startupargs/TestRetransformUsingLog.java +++ b/test/jdk/jdk/jfr/startupargs/TestRetransformUsingLog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ */ public class TestRetransformUsingLog { - private static final String FILE_READ_FORCED_CLASS_LOAD = "Adding forced instrumentation for event type " + EventNames.FileRead + " during initial class load"; + private static final String FORCED_CLASS_LOAD = "Adding forced instrumentation for event type " + EventNames.DirectBufferStatistics + " during initial class load"; private static final String SIMPLE_EVENT_FORCED_CLASS_LOAD = "Adding forced instrumentation for event type jdk.test.lib.jfr.SimpleEvent during initial class load"; private static final String SIMPLE_EVENT_UNFORCED_CLASS_LOAD = "Adding instrumentation for event type jdk.test.lib.jfr.SimpleEvent during initial class load"; @@ -61,28 +61,28 @@ public static void main(String[] args) throws Exception { private static void testRecordingRetransFormFalse() throws Exception { startApp(true, false, out -> { - out.shouldContain(FILE_READ_FORCED_CLASS_LOAD); + out.shouldContain(FORCED_CLASS_LOAD); out.shouldContain(SIMPLE_EVENT_FORCED_CLASS_LOAD); }); } private static void testRecordingRetransFormTrue() throws Exception { startApp(true, true, out -> { - out.shouldContain(FILE_READ_FORCED_CLASS_LOAD); + out.shouldContain(FORCED_CLASS_LOAD); out.shouldContain(SIMPLE_EVENT_UNFORCED_CLASS_LOAD); }); } private static void testNoRecordingRetransFormFalse() throws Exception { startApp(false, false, out -> { - out.shouldNotContain(FILE_READ_FORCED_CLASS_LOAD); + out.shouldNotContain(FORCED_CLASS_LOAD); out.shouldContain(SIMPLE_EVENT_FORCED_CLASS_LOAD); }); } private static void testNoRecordingRetransFormTrue() throws Exception { startApp(false, true, out -> { - out.shouldNotContain(FILE_READ_FORCED_CLASS_LOAD); + out.shouldNotContain(FORCED_CLASS_LOAD); out.shouldNotContain(SIMPLE_EVENT_FORCED_CLASS_LOAD); out.shouldNotContain(SIMPLE_EVENT_UNFORCED_CLASS_LOAD); }); From 0802c684b01521435f8be2bc6be53d994bc10a84 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Tue, 7 May 2024 21:38:09 +0200 Subject: [PATCH 02/10] Update comment --- src/java.base/share/classes/jdk/internal/event/JFRTracing.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/jdk/internal/event/JFRTracing.java b/src/java.base/share/classes/jdk/internal/event/JFRTracing.java index 8e1e4b16913c0..5882b2ddc88da 100644 --- a/src/java.base/share/classes/jdk/internal/event/JFRTracing.java +++ b/src/java.base/share/classes/jdk/internal/event/JFRTracing.java @@ -32,7 +32,7 @@ import java.lang.reflect.Field; /** - * Helper class for enabling JFR tracing. + * Helper class to enable JFR tracing. */ public final class JFRTracing { From 9d02bf6354d74366a892ff9cec51017d347cf8d5 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Thu, 9 May 2024 05:40:31 +0200 Subject: [PATCH 03/10] Rename methods --- .../classes/java/io/RandomAccessFile.java | 24 +-- .../classes/sun/nio/ch/FileChannelImpl.java | 72 ++++----- .../internal/{instrument => }/JDKEvents.java | 58 +------ .../classes/jdk/jfr/internal/JVMUpcalls.java | 3 +- .../jdk/jfr/internal/PlatformRecorder.java | 4 +- .../instrument/JIClassInstrumentation.java | 130 --------------- .../jfr/internal/instrument/JIInliner.java | 113 ------------- .../instrument/JIInstrumentationMethod.java | 36 ----- .../instrument/JIInstrumentationTarget.java | 37 ----- .../instrument/JIMethodCallInliner.java | 152 ------------------ .../instrument/JIMethodInliningAdapter.java | 76 --------- .../instrument/JIMethodMergeAdapter.java | 122 -------------- .../internal/instrument/JITypeMapping.java | 35 ---- .../management/ManagementSupport.java | 4 +- webrev.zip | Bin 0 -> 179357 bytes 15 files changed, 58 insertions(+), 808 deletions(-) rename src/jdk.jfr/share/classes/jdk/jfr/internal/{instrument => }/JDKEvents.java (83%) delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java create mode 100644 webrev.zip diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index c78826045df02..0488e5c464d12 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -549,13 +549,13 @@ public int skipBytes(int n) throws IOException { */ public void write(int b) throws IOException { if (jfrTracing) { - traceWriteImpl(b); + traceImplWrite(b); return; } - writeImpl(b); + implWrite(b); } - private void writeImpl(int b) throws IOException { + private void implWrite(int b) throws IOException { boolean attempted = Blocker.begin(sync); try { write0(b); @@ -576,13 +576,13 @@ private void writeImpl(int b) throws IOException { */ private void writeBytes(byte[] b, int off, int len) throws IOException { if (jfrTracing) { - traceWriteBytesImpl(b, off, len); + traceImplWriteBytes(b, off, len); return; } - writeBytesImpl(b, off, len); + implWriteBytes(b, off, len); } - private void writeBytesImpl(byte[] b, int off, int len) throws IOException { + private void implWriteBytes(byte[] b, int off, int len) throws IOException { boolean attempted = Blocker.begin(sync); try { writeBytes0(b, off, len); @@ -1272,16 +1272,16 @@ private int traceReadBytes0(byte b[], int off, int len) throws IOException { return bytesRead; } - private void traceWriteImpl(int b) throws IOException { + private void traceImplWrite(int b) throws IOException { if (!FileWriteEvent.enabled()) { - writeImpl(b); + implWrite(b); return; } long bytesWritten = 0; long start = 0; try { start = FileWriteEvent.timestamp(); - writeImpl(b); + implWrite(b); bytesWritten = 1; } finally { long duration = FileWriteEvent.timestamp() - start; @@ -1291,16 +1291,16 @@ private void traceWriteImpl(int b) throws IOException { } } - private void traceWriteBytesImpl(byte b[], int off, int len) throws IOException { + private void traceImplWriteBytes(byte b[], int off, int len) throws IOException { if (!FileWriteEvent.enabled()) { - writeBytesImpl(b, off, len); + implWriteBytes(b, off, len); return; } long bytesWritten = 0; long start = 0; try { start = FileWriteEvent.timestamp(); - writeBytesImpl(b, off, len); + ImplWriteBytes(b, off, len); bytesWritten = len; } finally { long duration = FileWriteEvent.timestamp() - start; diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index df1186a67e6a9..11e5734b0039d 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -225,12 +225,12 @@ protected void implCloseChannel() throws IOException { @Override public int read(ByteBuffer dst) throws IOException { if (jfrTracing) { - return traceReadImpl(dst); + return traceImplRead(dst); } - return readImpl(dst); + return implRead(dst); } - private int readImpl(ByteBuffer dst) throws IOException { + private int implRead(ByteBuffer dst) throws IOException { ensureOpen(); if (!readable) throw new NonReadableChannelException(); @@ -264,12 +264,12 @@ private int readImpl(ByteBuffer dst) throws IOException { @Override public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { if (jfrTracing) { - return traceReadImpl(dsts, offset, length); + return traceImplRead(dsts, offset, length); } - return readImpl(dsts, offset, length); + return implRead(dsts, offset, length); } - private long readImpl(ByteBuffer[] dsts, int offset, int length) + private long implRead(ByteBuffer[] dsts, int offset, int length) throws IOException { Objects.checkFromIndexSize(offset, length, dsts.length); @@ -307,12 +307,12 @@ private long readImpl(ByteBuffer[] dsts, int offset, int length) @Override public int write(ByteBuffer src) throws IOException { if (jfrTracing) { - return traceWriteImpl(src); + return traceImplWrite(src); } - return writeImpl(src); + return implWrite(src); } - private int writeImpl(ByteBuffer src) throws IOException { + private int implWrite(ByteBuffer src) throws IOException { ensureOpen(); if (!writable) throw new NonWritableChannelException(); @@ -347,12 +347,12 @@ private int writeImpl(ByteBuffer src) throws IOException { @Override public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { if (jfrTracing) { - return traceWriteImpl(srcs, offset, length); + return traceImplWrite(srcs, offset, length); } - return writeImpl(srcs, offset, length); + return implWrite(srcs, offset, length); } - private long writeImpl(ByteBuffer[] srcs, int offset, int length) throws IOException + private long implWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { Objects.checkFromIndexSize(offset, length, srcs.length); ensureOpen(); @@ -1060,12 +1060,12 @@ public long transferFrom(ReadableByteChannel src, long position, long count) @Override public int read(ByteBuffer dst, long position) throws IOException { if (jfrTracing) { - return traceReadImpl(dst, position); + return traceImplRead(dst, position); } - return readImpl(dst, position); + return implRead(dst, position); } - private int readImpl(ByteBuffer dst, long position) throws IOException { + private int implRead(ByteBuffer dst, long position) throws IOException { if (dst == null) throw new NullPointerException(); if (position < 0) @@ -1113,12 +1113,12 @@ private int readInternal(ByteBuffer dst, long position) throws IOException { @Override public int write(ByteBuffer src, long position) throws IOException { if (jfrTracing) { - return traceWriteImpl(src, position); + return traceImplWrite(src, position); } - return writeImpl(src, position); + return implWrite(src, position); } - private int writeImpl(ByteBuffer src, long position) throws IOException { + private int implWrite(ByteBuffer src, long position) throws IOException { if (src == null) throw new NullPointerException(); if (position < 0) @@ -1663,15 +1663,15 @@ void release(FileLockImpl fli) throws IOException { fileLockTable.remove(fli); } - private int traceReadImpl(ByteBuffer dst) throws IOException { + private int traceImplRead(ByteBuffer dst) throws IOException { if (!FileReadEvent.enabled()) { - return readImpl(dst); + return implRead(dst); } int bytesRead = 0; long start = 0; try { start = FileReadEvent.timestamp(); - bytesRead = readImpl(dst); + bytesRead = implRead(dst); } finally { long duration = FileReadEvent.timestamp() - start; if (FileReadEvent.shouldCommit(duration)) { @@ -1685,15 +1685,15 @@ private int traceReadImpl(ByteBuffer dst) throws IOException { return bytesRead; } - private int traceReadImpl(ByteBuffer dst, long position) throws IOException { + private int traceImplRead(ByteBuffer dst, long position) throws IOException { if (!FileReadEvent.enabled()) { - return readImpl(dst, position); + return implRead(dst, position); } int bytesRead = 0; long start = 0; try { start = FileReadEvent.timestamp(); - bytesRead = readImpl(dst, position); + bytesRead = implRead(dst, position); } finally { long duration = FileReadEvent.timestamp() - start; if (FileReadEvent.shouldCommit(duration)) { @@ -1707,15 +1707,15 @@ private int traceReadImpl(ByteBuffer dst, long position) throws IOException { return bytesRead; } - private long traceReadImpl(ByteBuffer[] dsts, int offset, int length) throws IOException { + private long traceImplRead(ByteBuffer[] dsts, int offset, int length) throws IOException { if (!FileReadEvent.enabled()) { - return readImpl(dsts, offset, length); + return implRead(dsts, offset, length); } long bytesRead = 0; long start = 0; try { start = FileReadEvent.timestamp(); - bytesRead = readImpl(dsts, offset, length); + bytesRead = implRead(dsts, offset, length); } finally { long duration = FileReadEvent.timestamp() - start; if (FileReadEvent.shouldCommit(duration)) { @@ -1729,15 +1729,15 @@ private long traceReadImpl(ByteBuffer[] dsts, int offset, int length) throws IOE return bytesRead; } - private int traceWriteImpl(ByteBuffer src) throws IOException { + private int traceImplWrite(ByteBuffer src) throws IOException { if (!FileWriteEvent.enabled()) { - return writeImpl(src); + return implWrite(src); } int bytesWritten = 0; long start = 0; try { start = FileWriteEvent.timestamp(); - bytesWritten = writeImpl(src); + bytesWritten = implWrite(src); } finally { long duration = FileWriteEvent.timestamp() - start; if (FileWriteEvent.shouldCommit(duration)) { @@ -1748,16 +1748,16 @@ private int traceWriteImpl(ByteBuffer src) throws IOException { return bytesWritten; } - private int traceWriteImpl(ByteBuffer src, long position) throws IOException { + private int traceImplWrite(ByteBuffer src, long position) throws IOException { if (!FileWriteEvent.enabled()) { - return writeImpl(src, position); + return implWrite(src, position); } int bytesWritten = 0; long start = 0; try { start = FileWriteEvent.timestamp(); - bytesWritten = writeImpl(src, position); + bytesWritten = implWrite(src, position); } finally { long duration = FileWriteEvent.timestamp() - start; if (FileWriteEvent.shouldCommit(duration)) { @@ -1768,15 +1768,15 @@ private int traceWriteImpl(ByteBuffer src, long position) throws IOException { return bytesWritten; } - private long traceWriteImpl(ByteBuffer[] srcs, int offset, int length) throws IOException { + private long traceImplWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { if (!FileWriteEvent.enabled()) { - return writeImpl(srcs, offset, length); + return implWrite(srcs, offset, length); } long bytesWritten = 0; long start = 0; try { start = FileWriteEvent.timestamp(); - bytesWritten = writeImpl(srcs, offset, length); + bytesWritten = implWrite(srcs, offset, length); } finally { long duration = FileWriteEvent.timestamp() - start; if (FileWriteEvent.shouldCommit(duration)) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java similarity index 83% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java index 09f811b6a0f2a..ee9b5f2b4cd31 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java @@ -23,35 +23,26 @@ * questions. */ -package jdk.jfr.internal.instrument; +package jdk.jfr.internal; -import java.util.ArrayList; -import java.util.List; import java.util.Properties; import jdk.internal.access.SharedSecrets; import jdk.internal.event.JFRTracing; import jdk.internal.event.ThrowableTracer; +import jdk.internal.platform.Container; +import jdk.internal.platform.Metrics; import jdk.jfr.Event; import jdk.jfr.events.ActiveRecordingEvent; import jdk.jfr.events.ActiveSettingEvent; -import jdk.jfr.events.ContainerIOUsageEvent; -import jdk.jfr.events.ContainerConfigurationEvent; -import jdk.jfr.events.ContainerCPUUsageEvent; import jdk.jfr.events.ContainerCPUThrottlingEvent; +import jdk.jfr.events.ContainerCPUUsageEvent; +import jdk.jfr.events.ContainerConfigurationEvent; +import jdk.jfr.events.ContainerIOUsageEvent; import jdk.jfr.events.ContainerMemoryUsageEvent; import jdk.jfr.events.DirectBufferStatisticsEvent; -import jdk.jfr.events.FileForceEvent; import jdk.jfr.events.InitialSecurityPropertyEvent; - -import jdk.jfr.internal.JVM; -import jdk.jfr.internal.LogLevel; -import jdk.jfr.internal.LogTag; -import jdk.jfr.internal.Logger; -import jdk.jfr.internal.SecuritySupport; import jdk.jfr.internal.periodic.PeriodicEvents; -import jdk.internal.platform.Container; -import jdk.internal.platform.Metrics; public final class JDKEvents { @@ -85,11 +76,6 @@ public final class JDKEvents { InitialSecurityPropertyEvent.class, }; - // This is a list of the classes with instrumentation code that should be applied. - private static final Class[] instrumentationClasses = new Class[] { - }; - - private static final Class[] targetClasses = new Class[instrumentationClasses.length]; private static final Runnable emitExceptionStatistics = JDKEvents::emitExceptionStatistics; private static final Runnable emitDirectBufferStatistics = JDKEvents::emitDirectBufferStatistics; private static final Runnable emitContainerConfiguration = JDKEvents::emitContainerConfiguration; @@ -121,24 +107,6 @@ public static synchronized void initialize() { } } - public static void addInstrumentation() { - try { - List> list = new ArrayList<>(); - for (int i = 0; i < instrumentationClasses.length; i++) { - JIInstrumentationTarget tgt = instrumentationClasses[i].getAnnotation(JIInstrumentationTarget.class); - Class clazz = Class.forName(tgt.value()); - targetClasses[i] = clazz; - list.add(clazz); - } - Logger.log(LogTag.JFR_SYSTEM, LogLevel.INFO, "Retransformed JDK classes"); - JVM.retransformClasses(list.toArray(new Class[list.size()])); - } catch (IllegalStateException ise) { - throw ise; - } catch (Exception e) { - Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Could not add instrumentation for JDK events. " + e.getMessage()); - } - } - private static void initializeContainerEvents() { if (JVM.isContainerized() ) { Logger.log(LogTag.JFR_SYSTEM, LogLevel.DEBUG, "JVM is containerized"); @@ -225,20 +193,6 @@ private static void emitContainerCPUThrottling() { } } - @SuppressWarnings("deprecation") - public static byte[] retransformCallback(Class klass, byte[] oldBytes) throws Throwable { - for (int i = 0; i < targetClasses.length; i++) { - if (targetClasses[i].equals(klass)) { - Class c = instrumentationClasses[i]; - if (Logger.shouldLog(LogTag.JFR_SYSTEM, LogLevel.TRACE)) { - Logger.log(LogTag.JFR_SYSTEM, LogLevel.TRACE, "Processing instrumentation class: " + c); - } - return new JIClassInstrumentation(instrumentationClasses[i], klass, oldBytes).getNewBytes(); - } - } - return oldBytes; - } - public static void remove() { PeriodicEvents.removeEvent(emitExceptionStatistics); PeriodicEvents.removeEvent(emitDirectBufferStatistics); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java index 9c37a1ab660c9..2eed7b918fd21 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java @@ -27,7 +27,6 @@ import java.lang.reflect.Modifier; import jdk.jfr.internal.event.EventConfiguration; -import jdk.jfr.internal.instrument.JDKEvents; import jdk.jfr.internal.util.Bytecode; /** * All upcalls from the JVM should go through this class. @@ -78,7 +77,7 @@ static byte[] onRetransform(long traceId, boolean dummy1, boolean dummy2, Class< Bytecode.log(clazz.getName(), bytes); return bytes; } - return JDKEvents.retransformCallback(clazz, oldBytes); + return oldBytes; } catch (Throwable t) { Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Unexpected error when adding instrumentation to event class " + clazz.getName()); } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java index 1cd7297928630..24b98bb629f04 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,6 @@ import jdk.jfr.internal.SecuritySupport.SafePath; import jdk.jfr.internal.SecuritySupport.SecureRecorderListener; import jdk.jfr.internal.consumer.EventLog; -import jdk.jfr.internal.instrument.JDKEvents; import jdk.jfr.internal.periodic.PeriodicEvents; import jdk.jfr.internal.util.Utils; @@ -83,7 +82,6 @@ public PlatformRecorder() throws Exception { Logger.log(JFR_SYSTEM, INFO, "Created native"); JDKEvents.initialize(); Logger.log(JFR_SYSTEM, INFO, "Registered JDK events"); - JDKEvents.addInstrumentation(); startDiskMonitor(); shutdownHook = SecuritySupport.createThreadWitNoPermissions("JFR Shutdown Hook", new ShutdownHook(this)); SecuritySupport.setUncaughtExceptionHandler(shutdownHook, new ShutdownHook.ExceptionHandler()); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java deleted file mode 100644 index 7c5b179248ac5..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -import jdk.internal.org.objectweb.asm.ClassReader; -import jdk.internal.org.objectweb.asm.ClassVisitor; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.tree.ClassNode; -import jdk.jfr.internal.SecuritySupport; - -/** - * This class will perform byte code instrumentation given an "instrumentor" class. - * - * @see JITracer - * - * @author Staffan Larsen - */ -@Deprecated -final class JIClassInstrumentation { - private final Class instrumentor; - private final String targetName; - private final String instrumentorName; - private final byte[] newBytes; - private final ClassReader targetClassReader; - private final ClassReader instrClassReader; - - /** - * Creates an instance and performs the instrumentation. - * - * @param instrumentor instrumentor class - * @param target target class - * @param old_target_bytes bytes in target - * - * @throws ClassNotFoundException - * @throws IOException - */ - JIClassInstrumentation(Class instrumentor, Class target, byte[] old_target_bytes) throws ClassNotFoundException, IOException { - instrumentorName = instrumentor.getName(); - this.targetName = target.getName(); - this.instrumentor = instrumentor; - this.targetClassReader = new ClassReader(old_target_bytes); - this.instrClassReader = new ClassReader(getOriginalClassBytes(instrumentor)); - this.newBytes = makeBytecode(); - } - - private static byte[] getOriginalClassBytes(Class clazz) throws IOException { - String name = "/" + clazz.getName().replace(".", "/") + ".class"; - try (InputStream is = SecuritySupport.getResourceAsStream(name)) { - return is.readAllBytes(); - } - } - - private byte[] makeBytecode() throws IOException, ClassNotFoundException { - - // Find the methods to instrument and inline - - final List instrumentationMethods = new ArrayList<>(); - for (final Method m : instrumentor.getDeclaredMethods()) { - JIInstrumentationMethod im = m.getAnnotation(JIInstrumentationMethod.class); - if (im != null) { - instrumentationMethods.add(m); - } - } - - // We begin by inlining the target's methods into the instrumentor - - ClassNode temporary = new ClassNode(); - ClassVisitor inliner = new JIInliner( - Opcodes.ASM7, - temporary, - targetName, - instrumentorName, - targetClassReader, - instrumentationMethods); - instrClassReader.accept(inliner, ClassReader.EXPAND_FRAMES); - - // Now we have the target's methods inlined into the instrumentation code (in 'temporary'). - // We now need to replace the target's method with the code in the - // instrumentation method. - - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); - JIMethodMergeAdapter ma = new JIMethodMergeAdapter( - cw, - temporary, - instrumentationMethods, - instrumentor.getAnnotationsByType(JITypeMapping.class)); - targetClassReader.accept(ma, ClassReader.EXPAND_FRAMES); - - return cw.toByteArray(); - } - - /** - * Get the instrumented byte codes that can be used to retransform the class. - * - * @return bytes - */ - public byte[] getNewBytes() { - return newBytes.clone(); - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java deleted file mode 100644 index 4bd182ec40342..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.List; - -import jdk.internal.org.objectweb.asm.ClassReader; -import jdk.internal.org.objectweb.asm.ClassVisitor; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; -import jdk.internal.org.objectweb.asm.tree.ClassNode; -import jdk.internal.org.objectweb.asm.tree.MethodNode; -import jdk.jfr.internal.LogLevel; -import jdk.jfr.internal.LogTag; -import jdk.jfr.internal.Logger; - -@Deprecated -final class JIInliner extends ClassVisitor { - private final String targetClassName; - private final String instrumentationClassName; - private final ClassNode targetClassNode; - private final List instrumentationMethods; - - /** - * A ClassVisitor which will check all methods of the class it visits against the instrumentationMethods - * list. If a method is on that list, the method will be further processed for inlining into that - * method. - */ - JIInliner(int api, ClassVisitor cv, String targetClassName, String instrumentationClassName, - ClassReader targetClassReader, - List instrumentationMethods) { - super(api, cv); - this.targetClassName = targetClassName; - this.instrumentationClassName = instrumentationClassName; - this.instrumentationMethods = instrumentationMethods; - - ClassNode cn = new ClassNode(Opcodes.ASM7); - targetClassReader.accept(cn, ClassReader.EXPAND_FRAMES); - this.targetClassNode = cn; - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); - - if (isInstrumentationMethod(name, desc)) { - MethodNode methodToInline = findTargetMethodNode(name, desc); - if (methodToInline == null) { - throw new IllegalArgumentException("Could not find the method to instrument in the target class"); - } - if (Modifier.isNative(methodToInline.access)) { - throw new IllegalArgumentException("Cannot instrument native methods: " + targetClassNode.name + "." + methodToInline.name + methodToInline.desc); - } - - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Inliner processing method " + name + desc); - - JIMethodCallInliner mci = new JIMethodCallInliner(access, - desc, - mv, - methodToInline, - targetClassName, - instrumentationClassName); - return mci; - } - - return mv; - } - - private boolean isInstrumentationMethod(String name, String desc) { - for(Method m : instrumentationMethods) { - if (m.getName().equals(name) && Type.getMethodDescriptor(m).equals(desc)) { - return true; - } - } - return false; - } - - private MethodNode findTargetMethodNode(String name, String desc) { - for (MethodNode mn : targetClassNode.methods) { - if (mn.desc.equals(desc) && mn.name.equals(name)) { - return mn; - } - } - throw new IllegalArgumentException("could not find MethodNode for " - + name + desc); - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java deleted file mode 100644 index bebaad4c81592..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@interface JIInstrumentationMethod { -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java deleted file mode 100644 index d48a4e3ac5f38..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@interface JIInstrumentationTarget { - String value(); -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java deleted file mode 100644 index c73e7d4dbdde0..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.util.ArrayList; -import java.util.List; - -import jdk.internal.org.objectweb.asm.Label; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.commons.LocalVariablesSorter; -import jdk.internal.org.objectweb.asm.commons.Remapper; -import jdk.internal.org.objectweb.asm.commons.SimpleRemapper; -import jdk.internal.org.objectweb.asm.tree.MethodNode; -import jdk.jfr.internal.LogLevel; -import jdk.jfr.internal.LogTag; -import jdk.jfr.internal.Logger; - -/** - * Class responsible for finding the call to inline and inlining it. - * - * This code is heavily influenced by section 3.2.6 "Inline Method" in - * "Using ASM framework to implement common bytecode transformation patterns", - * E. Kuleshov, AOSD.07, March 2007, Vancouver, Canada. - * http://asm.ow2.org/index.html - */ -@Deprecated -final class JIMethodCallInliner extends LocalVariablesSorter { - - private final String oldClass; - private final String newClass; - private final MethodNode inlineTarget; - private final List blocks = new ArrayList<>(); - private boolean inlining; - - /** - * inlineTarget defines the method to inline and also contains the actual - * code to inline. - * - * @param access - * @param desc - * @param mv - * @param inlineTarget - * @param oldClass - * @param newClass - * @param logger - */ - public JIMethodCallInliner(int access, String desc, MethodVisitor mv, - MethodNode inlineTarget, String oldClass, String newClass) { - super(Opcodes.ASM7, access, desc, mv); - this.oldClass = oldClass; - this.newClass = newClass; - this.inlineTarget = inlineTarget; - - if (Logger.shouldLog(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG)) { - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, - "MethodCallInliner: targetMethod=" + newClass + "." - + inlineTarget.name + inlineTarget.desc); - } - } - - @Override - public void visitMethodInsn(int opcode, String owner, String name, - String desc, boolean itf) { - // Now we are looking at method call in the source method - if (!shouldBeInlined(owner, name, desc)) { - // If this method call should not be inlined, just keep it - mv.visitMethodInsn(opcode, owner, name, desc, itf); - return; - } - // If the call should be inlined, we create a MethodInliningAdapter - // The MIA will walk the instructions in the inlineTarget and add them - // to the current method, doing the necessary name remappings. - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Inlining call to " + name + desc); - Remapper remapper = new SimpleRemapper(oldClass, newClass); - Label end = new Label(); - inlining = true; - inlineTarget.instructions.resetLabels(); - JIMethodInliningAdapter mia = new JIMethodInliningAdapter(this, end, - opcode == Opcodes.INVOKESTATIC ? Opcodes.ACC_STATIC : 0, desc, - remapper); - inlineTarget.accept(mia); - inlining = false; - super.visitLabel(end); - } - - /** - * Determine if the method should be inlined or not. - */ - private boolean shouldBeInlined(String owner, String name, String desc) { - return inlineTarget.desc.equals(desc) && inlineTarget.name.equals(name) - && owner.equals(newClass.replace('.', '/')); - } - - @Override - public void visitTryCatchBlock(Label start, Label end, Label handler, - String type) { - if (!inlining) { - // try-catch blocks are saved here and replayed at the end - // of the method (in visitMaxs) - blocks.add(new CatchBlock(start, end, handler, type)); - } else { - super.visitTryCatchBlock(start, end, handler, type); - } - } - - @Override - public void visitMaxs(int stack, int locals) { - for (CatchBlock b : blocks) { - super.visitTryCatchBlock(b.start, b.end, b.handler, b.type); - } - super.visitMaxs(stack, locals); - } - - static final class CatchBlock { - - final Label start; - final Label end; - final Label handler; - final String type; - - CatchBlock(Label start, Label end, Label handler, String type) { - this.start = start; - this.end = end; - this.handler = handler; - this.type = type; - } - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java deleted file mode 100644 index 2f5458c4d9012..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import jdk.internal.org.objectweb.asm.Label; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; -import jdk.internal.org.objectweb.asm.commons.LocalVariablesSorter; -import jdk.internal.org.objectweb.asm.commons.Remapper; -import jdk.internal.org.objectweb.asm.commons.RemappingMethodAdapter; - -@Deprecated -final class JIMethodInliningAdapter extends RemappingMethodAdapter { - private final LocalVariablesSorter lvs; - private final Label end; - - public JIMethodInliningAdapter(LocalVariablesSorter mv, Label end, int acc, String desc, Remapper remapper) { - super(acc, desc, mv, remapper); - this.lvs = mv; - this.end = end; - int offset = isStatic(acc) ? 0 : 1; - Type[] args = Type.getArgumentTypes(desc); - for (int i = args.length - 1; i >= 0; i--) { - super.visitVarInsn(args[i].getOpcode(Opcodes.ISTORE), i + offset); - } - if (offset > 0) { - super.visitVarInsn(Opcodes.ASTORE, 0); - } - } - - private boolean isStatic(int acc) { - return (acc & Opcodes.ACC_STATIC) != 0; - } - - @Override - public void visitInsn(int opcode) { - if (opcode == Opcodes.RETURN || opcode == Opcodes.IRETURN - || opcode == Opcodes.ARETURN || opcode == Opcodes.LRETURN) { - super.visitJumpInsn(Opcodes.GOTO, end); - } else { - super.visitInsn(opcode); - } - } - - @Override - public void visitMaxs(int stack, int locals) { - } - - @Override - protected int newLocalMapping(Type type) { - return lvs.newLocal(type); - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java deleted file mode 100644 index 9d17b17a8ad55..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import jdk.internal.org.objectweb.asm.ClassVisitor; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; -import jdk.internal.org.objectweb.asm.commons.RemappingMethodAdapter; -import jdk.internal.org.objectweb.asm.commons.SimpleRemapper; -import jdk.internal.org.objectweb.asm.tree.ClassNode; -import jdk.internal.org.objectweb.asm.tree.MethodNode; -import jdk.jfr.internal.LogLevel; -import jdk.jfr.internal.LogTag; -import jdk.jfr.internal.Logger; - -/** - * This class will merge (some) methods from one class into another one. - * - * @author Staffan Larsen - */ -@Deprecated -final class JIMethodMergeAdapter extends ClassVisitor { - - private final ClassNode cn; - private final List methodFilter; - private final Map typeMap; - - /** - * Methods in methodFilter that exist in cn will be merged into cv. If the method already exists, - * the original method will be deleted. - * - * @param cv - * @param cn - a ClassNode with Methods that will be merged into this class - * @param methodFilter - only methods in this list will be merged - * @param typeMappings - while merging, type references in the methods will be changed according to this map - */ - public JIMethodMergeAdapter(ClassVisitor cv, ClassNode cn, List methodFilter, JITypeMapping[] typeMappings) { - super(Opcodes.ASM7, cv); - this.cn = cn; - this.methodFilter = methodFilter; - - this.typeMap = new HashMap<>(); - for (JITypeMapping tm : typeMappings) { - typeMap.put(tm.from().replace('.', '/'), tm.to().replace('.', '/')); - } - } - - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - super.visit(version, access, name, signature, superName, interfaces); - typeMap.put(cn.name, name); - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - if(methodInFilter(name, desc)) { - // If the method is one that we will be replacing, delete the method - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Deleting " + name + desc); - return null; - } - return super.visitMethod(access, name, desc, signature, exceptions); - } - - @Override - public void visitEnd() { - SimpleRemapper remapper = new SimpleRemapper(typeMap); - for (MethodNode mn : cn.methods) { - // Check if the method is in the list of methods to copy - if (methodInFilter(mn.name, mn.desc)) { - if (Logger.shouldLog(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG)) { - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Copying method: " + mn.name + mn.desc); - Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, " with mapper: " + typeMap); - } - - String[] exceptions = new String[mn.exceptions.size()]; - mn.exceptions.toArray(exceptions); - MethodVisitor mv = cv.visitMethod(mn.access, mn.name, mn.desc, mn.signature, exceptions); - mn.instructions.resetLabels(); - mn.accept(new RemappingMethodAdapter(mn.access, mn.desc, mv, remapper)); - } - } - super.visitEnd(); - } - - private boolean methodInFilter(String name, String desc) { - for(Method m : methodFilter) { - if (m.getName().equals(name) && Type.getMethodDescriptor(m).equals(desc)) { - return true; - } - } - return false; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java deleted file mode 100644 index f8a356ac69300..0000000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -@interface JITypeMapping { - String from(); - String to(); -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java index a402ed9f85431..165419cc34a52 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,7 @@ import jdk.jfr.EventType; import jdk.jfr.Recording; import jdk.jfr.consumer.EventStream; +import jdk.jfr.internal.JDKEvents; import jdk.jfr.internal.JVMSupport; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; @@ -57,7 +58,6 @@ import jdk.jfr.internal.consumer.AbstractEventStream; import jdk.jfr.internal.consumer.EventDirectoryStream; import jdk.jfr.internal.consumer.FileAccess; -import jdk.jfr.internal.instrument.JDKEvents; /** * The management API in module jdk.management.jfr should be built on top of the diff --git a/webrev.zip b/webrev.zip new file mode 100644 index 0000000000000000000000000000000000000000..0d5ce44cff1a622ddbb52ca5704bbccb20147ecf GIT binary patch literal 179357 zcmbrl1#leElBO$WSxgo)Ggz{iS+ba+#mvmiXfZQmi4d4q{-c$pnB#($jGa zK*GbrgKNn!4>G7D?7>B9kPP&ZE445o!$%U^_X>pt55i$WaqLa*o&aG-_iwyE4sve2 zFK_uSzY+2%`rZV+J`A>BI|ldPe^~&sL!G~?H%H#TF587g4;TeZ9xhu1uUC!k zE)QmFD+I0daz4Ld}H2|xjG0+>=+@ith#R@pmnjRk`x^$S}R zp+;jdnzb{0Tr>MS1by3Z{|a`;j|moM0&1X{c~nP8X_dzuew9~i~#+w||fM&>m$|IkYXBHXb zdO|stE8JrsF54p%gu1XuSIKoznsaZ(G*5GCP&rCe?`fxAHc!nG!xeO%dV~}Q@g}M^ z5)PybS{D}s%7UFLB~Lx*-McEj@rRD=J^SK{vg7<$rYdO1md@Z6gr5*Q*ozADA-Qu~ zS%MXyl$2Yl0>*_;2oDcrqpEY|Z!*s-5+1KkmBRDsEeDFVV6oQCMCAB`aTstU=-`8K z_;w8Fp~Z1tD_|=U<;Y z;wM*aeip0`47cmk6JILh#HEbP`#$G)9dPmK-GFai)ekT{e|dfKJi8?X*7)>wy+gLY zCG9(mPEH~&EiGy5>N?olU;ny%^letQXb(S1MY)V~_s$rzTI+B3?VdIhpt)cAlq{J` zzW}I7na-`X>OxD~K2-W%Xxgq0Z!~pxwpx3~&1-gH6?ryFNi6N0@Tzwqbz487`|u;v ztP$Ra+WUh2kcNiQ-NCg%1P1~68&m&?wto)USxOKPlz&8 z_|LJnsHx?6!-4F5s8;HO)aBPo7GwII?7Wcvokg!&pgDEEL! zF&it6k@RXkZB{+1#4n_8nznz0gYoP2V@N@jAhncm9oXRgBZy3SJ=IB>&sb=X zWh&(G8W0clj|OGNKrj5@QFsz$9oobyl3Y*_r5^%4H5+$2Qk#`l>`01zzcce@WYHjj zDo{&O*t?LWpW2C+Qnavgij2Pge7+hubqkG4$q616V@+5L@wfn~)@z;^W({iN=&-rv ziu59aTxj)>tBAM6T#|;KWhcOLxPA?m(5Xe8jRqgo1Ft^<+ErYA+g>1gN6q7z7HU^+ zj(yKCND=HyLUZOW#vFwNuHH$4v~KD;A0M$WYe+};k=(Q&m(B;V<3!!|TL9vWmACdV z{Gl8E+@^6owz8QTo=YuFXuqtlsgA_Ig$HrDGja!s-8*+OS8)dp>LJHFUoo3Tkp4HA z=9OXxA{rD~Z~V*nWKFZQ1ok=qF8M`dl$IOaK`v#lK6~@yse6*X5|GgDI0w7P!OX49 z{3&**?4W}3pvNJ9!TXt8euWR)IQ5#$2D{(e8d2KXyr`~0QA3lOcH4U}%=)y`)zN3c z?w$EFyOlGdoXd`D@ZG|~G+!n*CmetNIr;d~L3W;gKGs3@6=GO`c8wncsm@AIS+!d< zo6VIx%waemPo?YIi-tzm{>CnFRmxEPtDeFqJr#X=9u(8&!>cFuv>duzk6n87` zSz#!q>J>@kKJg8WyFEgu7{AleQY20|TI@EbXxOBi4!ps-kI+&U4~MWD>+~n7E9>lu z%`Ft`$9+9_A6x&ZsXXhiveJb!L22FNKnmUP^!mL;9TL21z5Tr(=D2y_4^|ocIDjU> zH3tz}%^Z=*G>5$`mV=&vh0{c4S+}gK640eanQU;STb6!7{bhQBa% zA17A9UTabt_l2}fqBBz2`Q%NKNYb~dPJDtZhEMzy?gc0fm3Y0@?x(HZS_j#t(xgQv z0Ci8Z{W#p9IVV@&ca`y%!`)R5g`{nwGk$enr&aqJ?>TOnKPxw^f}chyc}h@HED-pt z$r!Vl(Co^vF3!^ga!s)?6nqJ9h@1lrbRm`#%hK6udL^qj&oRori((vt)fGUQ_fqnj zsHY>Bc>(qTn8L*oLVL*wzTrV7xZl|!%MLLQY{zx^klAAkOAT?t%pWTZ3f|QaXdN|{ z#LdqRmld?&p~g*GH(DVot!u3Qru2jp`a;1F7k>k$F=QxElbUbk4NF(TgGe$C)a%`j z=KR^&^%4a2GJ@Z4l#lx|z=UTDLTYu=b%+3cV78-geH7z$_PS`D#FAIGukuZrzWU-F z{x5D5gFW<+|Dg6SRR1+@YyV_PczFooe|`PeXF-1i z0)qUHO~b;-lEDt(WN7vudj`rMum45Dcg}0+y2eqrc}rXSQJZ8L-jqi9g}+jwp+M|SKq?}{V~21(#Qtj@%gr9WUcwn*WF%C;$39J*E`g(7bZBzQLdx6 zf&De@SD&{vZF?-&!^Gr1Y%8&7s7BP+CG$iGZ&Aer$Dzc4bH$%Ci4;gqJIq0pDSJB( zA}^)|z3iJdIqrnoI}IO=w0lM+ypp2I zNTQqS+@wPE+yv-pdo3H6$`t^Y$QhA9Ct@#zQ}>XOJCKU~p1rY$B~v;g=Mj2F-E;7G z_<4Aa@VhuU$-edbaCKJ1y)X^g;~DeW(H!y!c-qA|ZYSmZ=6|WxsXpFgj-fQ-1P>_D zarjN?`+l-@ni3Yb9nk0oqqtW#EY4_B#Y@B>_r=vkB;F!H($5iu1rnulBXbfagXQF9 z7ESoRTRMFwGBMieb7iBxGnl{Y@sbL~VQ!p!2c-*wBPt;(SK=;N1KC3jmWj(sBAwc$YJ+XC?y#$vk;60CShGtF4#XRAae( zQWmaa1)V3RxObfeFfmsmSO2jjypS+tfT-E!xL zAkgaj@Imc(-ZN9K=8*;a;cj>-_11^MZ+HZm!aNV+ipq*90l=wj?;C*HD7_Tqh}3GDo0{T8 zo1&Aw8=0!*9&lv!Wb*aClEnmU_HMX`1xl_!pP!92X(scG`tCq$SH~Di?A=?k-1jG5 zoJ3y*esQL3Mkara^D4lO{MGa{8Xi3lS@28x2w&6cx7g`kD(pLbL9RQD=bMRIU#F)L z$%hf2qO1YZ?=i1y?sIGA6tafsqWoPCfG#nL*2AIzjrBaMcevK8PV5#VY@Xg&dgDwd*LSh$Lc)>FmLyavW?q55-m~P~!*nrdgK2CEiC;xHEsR3XP)^oo&+wXP!iuJNk$N_;(P1Ru~cJ+emk6w8XRE8Mf@Bn zDo`P6z;kB?BM}o|y4dIUYYmw&mf1-FvOIw{+q3m^;=>UDpaztHeb`bI^_*RYEwis8 zpR7~DwafKLP#HCCwRFFqIRiiATv2DlOH+Gc@1>=Z5zCGBMSld^YP+Y)DvWL?I@g-{ zXC^5eZzm?9j4EWJN`@B;iTpxs(*kgf30p6Owt{{400n}XoR+5^N!K=cFQ-(TvSF?5 zd{YBjHljIpB%%Jwt5kU|hXn9ik@a(&k4)hg)7jEt(YE|FGP9T)rok4b0_Sx+nw7?Z zkG8>xc+5~g<&4d(1v*|a)T}HVcc%#%TbYPrqgb@6gd${yI+@P<@{(kz0|Ulp2=;yj zD#9U6VxX!cx!BH-lIW#_*3vG@n#caWWs9HCrj5b1(YlQuCr)3h8FlQWo|4Pm=^V^u z-|M_I%216a2ivybtvL15^6#a}eiMtPNd+z7BnR0dTgD9aDq9Q9GY8DOs1)VI*U}%O zSmRvHkTQ+h5mFnLq(+cd;7*GH@}OFVyh)sRT2l}lhk;ExZ2c*Lb|l}zC>I;5kx&qvZ0 z3*}~f<1%P~$|)x)gbc3mtL&9I*_P1Vb*r=`e6tH5!Rk9TIQkA^Ep8GoX7Jviw>?~9 zn(*LWK{#!TX~>VDCZ(-{TR*Yr?4d`zq9W|KQa!Ebf`l|m@WI*RrM4r7Ksp_kiH-R( zi*I#f4wEsq3k#X*OfGng!?|-VGX>PK$8+Ah@F%b6^c(n(BfRVl-MJS1ie6ddz^miqRV8no5#7FwPw>M)gxKm-=JPG|}UpyjHxj3 z15m(C4>e&}#D?tI|Ih^f{`SFr^I!*CIq7kJ<|2tFXNPK@VuWqWmF0A86qR$7IrtGo zp<{pKWb|bhQ}bij^Z}e6@~d0(I8kPzj^lifSxQ1QWNM^;o=guhvs04^QAe`mz@}vl zKkumq(RiYzTTj#&XBuJu+;6bM>lkUcBQ1@s5j|;q%tKt!$_OK>(L|I+?#-6)BU|__ zn_4&OV!G>8_5?b%Q_r)KjB6)y2V8eloQe9*xVn5Z#_}^W zO?W!)ufL;0*VR%BKO?LM-WmO8GpSz~Rpn+k&8GM@xDWLt3MTj75@h$^68?<4`CWT$ zN5*-PtA$&tU=`FYa`$;T`3UdSoj3Iw85B?7CUG7RkO1l|b!ecRdemVk@vaCYW{#^f zY1f)n{I*-&iPR3#nw4GT3Vn5huj9m89o=|)k!oYjqM1-QZU_Wd$fR-~0<*%oF^(hw zq6nFw`5K^cLCtiH@{AjLJNA^8ti(M^wOib92SU3eT!higdXe>P0=fh?hS0qA;6J{! z#iVdcG524RNnB3v!cgaSWzyG6zF~V44nH0dm}L%z_px63Ak;--t2z@Dwh+!weTl-w zgNyMa3dv$%awl4oO zr}d>iThsTKuxs06niSF!#ZhdKrHlkjfyUr^6DuB}Ru?ow>(lOd}_CH2HLwTQhOJ2P7%@pV4h{$huT*TC7;BY5JRPM8~(cgRmw|ca|ynYsh|7qTS~Lw00==6CxVZ+0$942XXX8-O98$2Cr4= z4g6qAPI%w%0?@Yi|+wX!zoGfi-Wb-PC151=&`JsbvZ{)S9mepUUdkf>I{9|K&n zgu~!EaS4tHuG|Zb7(=m~7ZNQ(@zF%5`D%S#A1)*ceoc8hOQ=%1T)gWHkFj>w7%nuJ zy<%vbmk(-9uk5tzgib?)SXktOK|^!pE0Sj*kNdks$Ug%oy2&voy)yz>ZhK4r7^20X zy@EwtZM%t`XpD=ooT;xn+Kck`^a~IUlK~>|@KE{s&|k)}hr-Gu;SvfCBz+gZV*Oc0 z2+I7-hOZuR!cwp%G*){DLziU4M=ujqBq?yob1tnD7!X%y4^hy2r!rs&DjKnKu+2sO zy-uE%S=pXU-KaWDNf2OlakQ>q6`Fb2*ZbYdN@GH`tpMBYOm-~jeVPXA;B|)$;TZqy z90Bp(AQl31G=@ty_Gu{Oz|o2^w+UcQI$RB0(!_$qDlLx;P)oDbQK${5H&>|5>#0Cp zMx@yEQm9p8pjD`dMu$8F)UM`l<@dgb_Esrq{F&XeLjz|MIi`XB8#BIjP6UwSDzGN7@^5(Cn*MU?@rX~$dvy|PiSgi2j_v4v`RvHFi|y-|+d0LiGP3Xco6OV_2)*RS`M%t%-@<8v970b^Db)=Q>c~hs!~QjLr$u| zgj~wC)Ijf8_0ZheL4!kj+HU4$VSvl9QV|xFInKuI0&6HG*@=&9VAI$)ZVp~ZWKuFF zLu{2sl5(%@e`7kYojuche_(-A#jvaoR>|YvzPn8rum8H_>$J{Kung^=69NhmQY7sn zk{?(F7QuzTc{NrNvhAht8iae&Po2?3AnN?HIHSfHI8r$m!B@wRFx3Ff617^fDo~@` zcHuCco>cwKTF2L_R_wTKZQNG7ZG%9tGhw5}sgpgx*PkCas)`n_QwN?-Pccsdl2iiCFW{M#i z^Ch}C`(5oC&0?^cDyM@h(ZIPhtV*W?JFV~a^jRy(Q&!TZAGlJc0n6N-bO^Jgx5f?X zCb@tz{w3Y=C9fY_FQc;&##|2zpPa3?1{4GY$5n?VjdJVeW{xIBydY#R5P#vth*X2OAVK0E>&QqRF_q z7Hzcg;;u%4=q7}&z}bn4fS*7vfT$f2YIQz_n1LV{<_{)gXLt^TMo`7?)q-`d96Ue@^IeqVLL9?Fm4?$2O7^8Qb8 zjK1u2QWR#)-cua3`QQ=e9y0sH?zO{iP7+YnIe_*NP#~XvW?*(F2oM zcWqIEm1=*EO(j2@i_Q5rsXR?r<;t{9X?8%Ry7;gMtR%91+vS-S!w#r(6O7=Nvr9)7 zL%#20?H&G?c;p7@wToY`cSOXHUQu@p943d2=-E`4avZ&?Z`)^JQcTk<`fOu{PF zEzLx6Qp)h;ZC@T3#`jaPSD|mI4A{+6qrqvilCqO5#~~Du{pm&bU9{(b6CyUS9kY-N ztv#w)BO`C_F;U-$9IuY=t)2U5;*UhO8r&YmF7kRXC*na*Q8Bn`c@^Tx6{l%gYtC3r zVMA{%zUgX&5d!R~YkAtZqjqH0@>qu-F0sskLi*GL>52lO`2(uzI9o9J@!R!*`v!V? zBiukgERF>Ab8TcI;PNKE<4zyg%}f8Sn$E5BZ1cGeF&aIiv*f82qhy&B+f5r)FNN$A zaP?C37YfBqBvX^0Hqo?%D)Mxu4}LY-}Z3rL@>90sA2zzEmp z4Lm)jLlxxjh+?A<@>qEpUoY#U8ra0p_IT{bGOa~vju?GXI3W6{C4IlZ*UQ#hkAgz= zc3>lv<2s(EMga0(V};pXU?G@vHD0Yg0m(yG)Vf2~lqEqepy#~=^tWOieStkPt_&3D z(Iu>gQ{s-@)bOy;Og?vY*!$n7p*b3gtT=o^T{8N_>2yio{1QW1nOp{haRLk@NbBoZ zrVOOVT%XOw(m3I$F`V7!NZ^NW1VTF@$_L}~KbB&2;947OS`@|VO@b5!jS-~?y3DW> zdEUl3s9F)FYyy9-rN)Jo_{F|EUj}Prb2pSe z=2kG%A*xZfGo!v6BgGbvmS-;klo7CRisxY}gO+1JYx5_yj>daf4Ck8)xQ?=fQ`JBa zqN965dS-x7rjmj1le9lH4CROwxzoNIf}0zmUbbpY0ChlNaS*&)UYkOor}_OIQ9*Ce+Fg>M`?+Fx(?B%(ukG0TTQ*t!4%I(1nLUOw zaB2!nZX|VKD6|~D%nY-h?ZDEr4Rl}A-{44XMm(?%boVHoV*E1OAt-?&2QRxqRAUb1 zXQG*pc0m)u?pyAE-~t*;biK(v7uRtMde)wxCrpd#x;#>3oG`IX}wlO|!U#)~JBif;Y4e5S6* z)Z$CO<4o*FW`2%F)2uN?d!2`;nNr&bmN$tXP3JygR#^0*F6GhGn*Y697s8f zm~Uyr-tIIp(Mpq-R*EdvJ9d4lwi8d8S^=K(D|L#`ju*VGSbN-Ab^%lCl>ip7q(B zNy0nIo3MM==dq*d+r^ojP%ESZ`9%bWHR@V&@IX_cBWm9_qht?_l%JmCR!&unTOK}@Gi_=)N zY%42ZVJH5|x=WNo=jN1Ua)h@C{=!r;=Q*$>ftE6fIf8-Ij~%N|o60>-87Gs6i3tBQ z*|N6dme`J%mL>?@$PM!O**vHHTda>8qcJNBe&)e~Y7-7x3tF-co7xp@f>(zO>OxOu z9MckKGb%}h5NO2-b|l3Fa^LuAp+i+;olR}QZ*(Bp+Mf3wW-7LzLPN=_X_n#(hJn0L z--I?;n|-j;Aa`#jo5rn4~@ zT4e9!pCi^F?2~!!pVX{i5>OijPYihgVrVv3Kv=%KnhB*^02@@cx`uBh@_zoxC;g(? z=qn&;m=32ovn7=!!-`LqkNiGERKH!(n+El?e8GuSM_jPKA=LuvZ18X6K8ts12qrFi&bzha`Ln=D$3dKim9 zazaRC~Dg+!zwZ#G#I-@8*h`wAA$k@~V zs{sc^iS^Npz`Q^P7iTT;`pC9F2JjqYdy&J|+S8|&mw!2%&}tfqZ&^^J?vUd&T(quuK5_Vqk_+=4w&yD3(jy4nt}rb2^En}ZAge$mfNF(P9iT z%i9D&5tvZk5 z`FX{(WjW1ZR}9>?n-s&IrE=2PWb|_Ddc`5SA<5uLD*7zG4$@;uwN-xrTZ3)}$uA0X z-*mC~Djo$>xoqA-yzl5A!5w|C5Lw}G--GG*3Oe6@CJ`yxIXa8^26kO9a?;#=C9P}u z?)0{`Uvju3GJ{8C7i}t%m5o9o;n>C8d(vgO;Ot zb|wCV(tG37>epKAK+Y5_xFMIodKR~z+eK(o*Q{r6Ma}9aSymT$EpZIH3|~9}&jLGx zO=_o4ffHEhP_iha_PQ^Izi<211iCcfk}Ig}fOMFyCfuU2C$jvgKCr+bd0nA!8$+LN z2=VzV^|#pW7pl~V3THXeDdVIR)TD618%V>xDc{0Dm;JLI4o)m1MO=*Cat%((Fw8^E zc<;cRw{$H#!*hQc(AooU`Kl*RWZ8vwHx;xZ3Jr;?RN(MEx1!&t_ELTi3qk$sA(%IF z@RP9te&(0sG50%RWxD-FMaatu$84;W>Sadd6}OnZwuvBxsGA2epT~q$xX;NUjZ+sm z*|d;@aT^f4&3JbmWdq{y^#=1g~99bGh(LUPv2fm6eS&MqpPIBd6lcI(^MFuepUs1 z4p`>@`cgBt)LDb0wy02r^MidxgHheB6|v9;ylhS2gd?sEvCt>k5>2)BLEs@S_yFxB zwY^(>jP=eVR(0OUksoY~$=hD{E!|gK#nW0fvbs~OLOfj4y1xLuHP#5}6MRxaJN?@7 zp{R#ZbuP-&CP=R;D6X=~g1JSUqsU^kSebq$s(et?`+DhO8+4_gFw_drXx4PYdoMm@ z`7pR4oSxU5^IiA$7V>?O9ivz17DHkNJ?KY_j#t)6Htp2M_8#;{@GV6#>cOu2b#Sg+ zF3XV~WM9CC3JBfNB?QR$MriPL%`u6|6i%3kc329dJ>-L~PxL83BMc0b+v_DvtwS5o z(Ou5?u&I`nDrcbBRgDG;k35FI3rWB^P8Ree?kvnfMH@W6tAo7g$TMe%$(L++> z-1JP}?^0e$idyVNt>ny$D4R~W`d}<2OrspUO(&pah+!ud%ivq`t7WF)n7GKsEcL2H zB)Orx4U=rjY%1*zNF_(5+;Kie9MqY#Ov&>vwQ-o)p-ETY6}1$sNq97qUV1pdypSo5 zM}-;4JK^7wot~uhk&&wTB>jwD?%kc2uKGXkd{|iM2hSj(weAlZx6}ecz>L# z1OmZbtyO$MI=F8qCT=I_JRRLZQ)bkTbt6@*@^Biqn&!QiLVzZMeg30YV&=%dKq5)v zVN6=Db5qE+co58NS~hNGNDGIVqlO%hc&Fc~qe__W`D1*q^Z2tnWI_qE4;r}7URhT& z_z_K+u=!rE_8tk|sX>v4crc;BFdTX=B^Ki@k)aaj&*IP!(4h=4-={F`CRibevwSNRC#X%5SvFw{9Y%>+dB%Qny&5y>9ehxpVr0 z7Qvb^WyZeYpvFu*>d$55e~CQYK&Oa2HsZPE^}{**>_G;_myE#Ml@J`EM+^6-=&zgS zO`>QQ+t#I5z_fkaKJ z%t#`=ORimQ6~(Ql7L3Nbw@Wuub8uDhbY9&cl$>s}k}!4mK_G(>OfYF(y#Gz0OM5Rz zk0yz1qNObZauu|wvX=OH>fNHD;|JtQNRR!JJmff|xUQ0dlD{U1mxRlrZT`T7O_Zd@wn(Cs;l7u2o zqRa<^;NH|%lQh)hEx3_RxH+KokLfo3R)t*vkJ(;`o}XbT{&{R+w)0(V%*Aa*Lx}rN z$i^ejke$pBcR44GsaC1mRA|W6N+6W_Jyz``W0$#{7cA(Qpd*lnYQrMyHJZL+zsKVFk+P;{cjV@f-P z9dO(7{&;W0_2g7euP7aeFh$0+yxypbkcvhW)Cq3YpWmDqDJiu?)A(u`ko7D6i zjd34>_?l(o&o!r5fv>xAjoED%s^Np*SAq1Xx>3P-fmva+#jrw4QAq3>f^`aZjyz6l z-nR$b!_oEFhx?Px7Zb9si)T_y&kq?$?_@G(gGM_SjA?aB%6%Y6)okKkJ+mg(*nv5q zzqsYTBmPA-W6k=2NGeo!qUA84Ml&3z$~0-Qh&`IaG^M&T426 zKyN!=$H=bJF^i|l6|h|tr%Xexh{>wQuUnaaf5fGn;pn+<`>v~bX500AkO7>0F8SgW zfSaV2ZmS4Sm>+95OQ`J%$kQN0PK}yQg0exZCEE^QjT{2kgDE9NFk>ri#`cUkJ_S37 zWPhr^=kyZ=>3#CK9>%u893R&A@N9NzpU=1+JFmJdrcISGHEh9s)f@IFwZl72#0^u9 z67WTfh7lugGWsh1qYR9Mg4%o{dXa~YuJ=sWq}U)^xnau<4yOPrgG7BH4K!&%&*l)x zE)ta;t(H!xmo)Vnrbuu(pF>-+1%zC55z+)t{z8Ca5WBD3B$ZRPB8wuGN@{>^FpF+W z)D%Jc*LB&Lq|#WWlCDD?iwG40Meq?A@%EaNce9&1H-qm7%;p=>)#2$diobO^jGvZO zsarC<+(h9YJkzS}y>qs-l6HI=f6u5U6f_rSORGNI#lVr9dabG`xr^!K)C>ubE-YM>s-u_Dna-)` zKNfrcUVD=0WmX~f-WEKZ=`1dhoXiH(Wu`@eE14r`c81uVEuKnpy8PBDY5Qf^78uSrb-H~}g z7E-4KY*DCP$i3;pbNf8=f>3N!Pd2JOqv*ku4qA)wygmNnCR%xm=@SxOfWAjyjjFWM z<0!Ha30H2CdUoOZkDR?vVhY2NY)n(C2v?}36hwafO)!gzg$I}t6>2>{NPF_mX3?yk z3-&kV8Tk|Usq1V`*Djv3sN>XS%=_H;fhGm+ml9=5oXhe3Qlb~ z?LW-F_7Usgpyu&=H2$imA?zdil#5N;V$Nh9N`H467V~6JGbYAY7;W;J$LkMi+XKqN zE?$1JSnRJB5tDK_z&HVCEq@^o67XU^q!GIgYuk8$p-H*!&voklijF$GpEqq=sef93 z_`=flYwv`oy`uxdBMM>Fgq5bjo~?CheqQOVk@NLR5eupNj<6@!OsXVss=@Fo$N zILIzrPG-FH{_@56Ik|9Mf0llRhZCI(FN@33t#l}K7~uJxFgR|x(ab#>X}=EII_ZK< zj{>v00Jo)Tkw5wOWeF+*dpHC*iMfjT)-RB7Lk3RZgfbB_*o`+78>@^hc9q)|XHc&l zoS^U57yxI8{S(g{eb9p)8{uPin^NLXSExF44Ms*Vj}2A zEW4q;vQ@K4z2|Zn0tv~rb0TiVGf6$R2@=Rs#En}h8iCPI7DNt!ewr@s5BrZRw$xs< z1Q|5Y0xM!S2yX&rb8M^Bzkq`zAFPHLaEoh0PGEwI)amNpy^?|BnNfK9YGA)ayG7}R z-ZJq>K_kir3;c4OOzI8~l?JebQi_ow7BdCr@gSpTmmUIcPXZqg=St^0|K{ zuJ}6Mt3|DZATcp+$a^&QpC^^^pX=+l$mA$e4357ZY*%PH+n@;om75^6CKXs!-wnB? z3GR%Pse5(s4a2lyD=h-rxp{^f@beNGdIMQ74Y#@cR;@dAX_tJf7Xciw+LENbFgp>6 z4PTAkv>d;O|8~Ff9E!?dcM}^o=6Usm2Qedy`thx2`ztQI zf=~mX>DZKm!S^mtlTOnH(h_kbgz@$*`ozbiI|99`);|9jw;c^Z9$YIb$+1hxX z5o+n8Wf}L=FN-ejMgrMz3Jq(VL4Yvi!oM#Brfa~-Qm#y&?<9P+@OX3MeJ=+Ll)ycz z@B6{4R})+RgPwP%!vTa^MaA2l1RYzB1pAs@5?4W(q2r}yuQn`fO6v< zs=hzce(aY+!fVYWg5HfqhF%V;%}jnmcMYm&mz6uqkI06USw^$(;z~^I!=Dyf1fsRl z);#qU#ofwE>_CyVQ(Qs^6!v$@eYt&bEeC2Yf-OL%XXvH}w#!$Qn;}a^s^>3E(5e6_>gUDi`SEl2?zbfa1N_?*YKCEC7$Ez(g`7Woudx2YwXxJEqV^A5|B~O`Z^#n=zhn)q0FI8vj{gmL^8bqbpNsR~Sc3Y$y2O9)`m_9h zS;pMP$=JaLVD(=-t-tN@|J<-^=kVv&`v0}w4=aF^iLHaRqOqZ^gORZVg9X3^z~Er! z_@DcI|HT$x#cS!fCie4B?-oT{IeKRv^^PP9L)RQ}STJat%*hzL;+qyTl> z+S}vlMX!GLOn*CFiYO{8FYkN$MRxY~>t*Z|5|$q0fz`UzO-{Gx^e5AUPZkBO7r5;= z^Mu;{?`0bLoqV4xf*U>qn0n7TqCVjz3uBPrg@O zuX(?5(55%g{Pg-Hkx$R4Th%TeuhT4AJbK*YbMKz+wV!cU{SBm<osSErglL*sW*>>5qgDU#>TI#H*5Hc9}s&@OnS zGc<&s^#J(ZJ;Jd;Fs@4Y@YCS$5;}$%1E2c&Ms|ZQ^zBn-ar5haVADsXgh>C%U$jC>~N?lwxfoxk;+SlNCaTpHiil5#>+6v`VP#pp;pr4 z3XKlv3=SA%;i^J?fPN-O?{xKnSC~l_NK*2+1Gp7<9+6krn1GM1%-$nU#1&ob9+JGdS~_?*wY`Q7fzqe4g{!cYaG^0$PcU+ygwh`r(29f508Y5la`{G9g2e3o zl3f2Lv5}gPQg}owVTVXIqGpx#yM${m`3HzZ-(Ec#W29C-9pPhM<;4c@ zECj=t)d)!i>igW7O3ug^(65rS_CP#DjXlBf!WMAuzG{%6;WH>d--+?MuXTE3ZTVK7aXv}%Ge zhr#M!J;5F$UyzpR@P<(WAnnK`dJ0}E#qvDeu#+J4A<&1z^EIdx$#yJ~w!Qo;H2f{0 zCcm_!0uy#na^uO~9aDZiRf<(A;5}^H4s3N}-#NOc{4TE4$q_Rk_kfnCTsDd@&{9RL zz{S=#XUEG*Y^EgIc{cNLclQZ@H(|VR@Orq$^MKgJdQ{gYz?%X_KJGB&#+xqp`wGU2 zI&ieCngo_-nQ17E>r!=UOIMw4tVAKuFe2R z5H1AWHiez!QjZUkj=14h>3AgA%V(XiH(I%)$`vCGCV)79=(|bRsSEX zy;G2=VY8)Kwr$(CZQHhO+qP}n)-LX{ZQE77|I;xu9TO*FIy&a!z5OopTbcQ+l~v=& z4KZ(9&H4BT6Vga@Hv5~j{}#9(Eb9l01K&?nq-TZSDlj@LOYUzzX8hnYU`^_K12OaM9Q1t!wThF-v4PKtC5qH^_|7imA^hRjU**{Z94%pM zEDYHXVw#T8^20mj>I6-cY?0GsN5RVk+^`x4b>BGsqc8W#*MTju8(v0jH!g=&sDG=s z(XeCclCqzG)ZDLFeLd;Fa=IXxFGB%is@whW0*xKevgL7N(G#>ts_jW!WvRX^_)tkNEkIgrjx25@!!?&J zKSb8^l8hG?&k=S24=@V&#>fKKR*Kv@^adMLtNMHd)C$)=yJ`*{=noM2EEh%C5}9XP zsY4iA+0KxRdA5A*85u>5?ZLh=|NC^a9ipIRro+^MG!h~iNhAJtS?rg{RmOCeTme>l z0hy;KcY^dWA_^D zT4qK8Gh-kF<6;FiI7_WnTtHH}X`soz$H+q`(b0g^BA%0!W9VBFt2rseB3bo6NHR5h%hN$aVx ztoL}87Lc_>Rj`6TUBAEIxS0ij8QxDhwU_lw2crdL*sWl!fVG(t1C|2%msk{Fq>%Ms zg}k-OrS49P+HC8aHJCk`<(}5%vJW=LoS)KaCFz{zdczS{xj@omL_K8%&~MYgHm9>fJMFL(+4PqUpmR z#z<}J%d+U-&hq5+>Fyb$K=Kte%AI7x2<#ad6-qE=_s}+w48W;YazeC9F5^iTinFO_ z`;vAh?7_F4b+Id^eO2-RZq~q+rFCslB`uG+>Z+6|XXl-+(Ltw@ts+@cu1<{L;MT#U zmI`4uG67|{378CHr&&vyJ--zMu$|Q@wGniEDzey3Cb;ZzYS2V?2!?|sK9$|;u-HEI zU^u4FKFziRqI<*_T${0h(TdmsOSvS-I{%zL6E|APm{)vC+C@Nlq9PYRG(`Y&lqIyRx477a~wYb?_pjdI;4~6^e)F4Iy6&j7Y1~14>|| zsSF#aJjL;57=rLM0K=RKBY8a7^k++C0F@Iv43k;}ng6ZHhiRsRh8+!qG$ea*W%S3x+^#T-SqA6!GshuD>G?(vqi_IapJs zh$e(7bWoPXY;=Zb=Xp}O@gafgiVSzc{Gy*>JbLsGOO3?+-sk}$V*AcW>xwx`kJv{{ zNjZZ{zXkGqYx2B`J%Va>CB(Vz660ARO4ideSxMa~;MKF))#w!a6w!B96&=Yn^sLThpV7oOgdBVlqZ?&5%c876pVO z$2l0PU>tfh((P_KfzYFL^OS=l_ro5+yh=cZn|U$SS4d zi&P8fxY{|}x(d|fx))~P!;`mwpxP=?e82;1SIdO1P@#JAji=af1udr6>qvO!Pq8L# zQ1056lPueFS^cb? zNYUr|5<9prYLmB=h@(p^+RP=v%Ds%gT;@NOk5eCK4&_--zou-~77g_!5hutz#Hs-J zAzS4KME+&zve;yddnk0&%i=5 zsInf+LO$AE|AMyD!k>|c>zj?=%QkJQR;Gai!2jT*c4vJ9JAbGHQ%EYgZX+EBRHq%I zg)X?2_JX>tq+~pYk~P^&S%&^dGOH2kEc)Z>m5qviInD)qxwfvL4{4;0HPF>rNHWOV z${fV~d~TUGTr~oo0(0Jo*1D&A46q;dJ%>m?80bzr z43v%hmUJyTwgPW+1F$W$sh3+O+a#4Gvg>`o)df;HvNiKww|+yBM84#y$37k|JGrQk zV_Rr=q5<^~;St`Z>p#Qbxh;cjSWBiF6Qq2>TNw>P>r`RUuKrl{#z~!%q*1}22mw~^5qqeCuD_g*DmN2MD zB;8%KgOl1I#~TJ&c;2&Z8(3|beodS#GLtt2`?6Q*oGvw@VDok$#}e<-2UH{No9`x| zO|+&YdFJM13DP`=9XMf@U<5*xO-j!I)L5G$j}^Ff-N_jvaOF~dFz}&9pNvr}HDsq( z!;vw6G0=+l^)K*Bt~#Li+ErRLR(&myHt>?YMLt5w<|=%Uor_$*^74NA=37daJ?K51 zV&rI7VR7=$l1mYExb!Jm8}_1g2^rg?=Rt0C|Asw9C5OtF0*-owl0X~^1{2%I!-orBn2(u&{c0PR3ni?62uo)>VpmQ!)q9176g+7SKb#?$9glf4|T1!O2t3mjtipt~WZ2%MCLL64lM+EDSJXaXLIyjhoq@1e>PZwGfb@w*$PL%C{@U14gZraif zyFiZmz{QM8ph1Ad$xQt7k0CXhWV-?>1(3BZQzVU1XDC}i^7b-ggX)*EO5RWO)D1|u zbS8%j`U3>CN8Yh73YcwEmpd@&c{>Q^-%lg5LijN#ERiH@2UuL@LSzFIaXqz8VoM@! zDu0@+0@`8x4I1vz=17;F4FfkFgX<>x4HS^%lfW+H`VLn`HP&6>( z1|}SQva|NjKz=Gw)DZf3nv$B(vI12Nju`UL)rk}LAvl93PL%W~5JlML^o*s6tSuRt z(0d2P434Pt?!SOZ-2;pF{vw`BhY#hPO{yNg1CS~>AuA;wu7>h<)rTk;vtB_OxmLe- zu02^f`Z+T46H$0Iy?7fNGC#me6#)x@T+}NzZTiAHyz(-{F+#Za&l&JzIw7znC8$Wp zv^_iLs(FZov8mTq$Ogu($vq`8T@*nzARa@9WUrp{1Ra+{B;hD(D-0sW)=PJcq_!o} z*v$0c(i0AlUy$iAG)|FfjfjiB4-mTgWS)gnBM`8_a)k(qP+SO40IsG@#c1UO9ecs~mckq! zlPB0sk`EwpuuczZ%FsCUhE{^0RdagHVN$Bbu;Shn5R&YA6EW26D?ou+X2Hp0E=$cv zVsT!eA@J%MOA&@AKnjge8A2=}fxVHq9+GCQ1CBF(mYATq%@ZdiVbVb}w-_^vqas4e zs}}Jdza)`SQr?G{uN?M-NKyQhWTR0jcI|8OULS=>o$ai%X$0+Wn|;dq$yR{8+r^g# z%h#4}JH27;Ys`H&d<07mUHPK$@N3cjl8R18p>oiQbPC2y5JMN-w)4n-N38z878b;mM4FGn5f z%}Y<&mkhbIm-n)+yw5e)g`0{E(2WUw;2m+YkA^_8j}+FI6$qb_sZt{g8gxo$%EKsDpH^9+TX_O8JU}PfX zt68Kn<-u&|l%uABPqJoT6S;=WhZ=YahKo|7st8T#OF>6FmA( zx*(uFqxQ`~;8Sx>iN^#n+_>JgYtxzucm}n=_f?KBZ0F7}ja)n-L|X9s3Wsr^DA0(+ zAhWUb;6ivf4&81g6>g$73BUmtgGY*hfaH zy=SP$Zs^*hCzg%^+mOcGHyVhyD#HP#q^3YY?}oAtXnzam&vzRx%FQ`5$Bso2-khH7Gf!SF+d!xm$jS zE&u{!2&u=I+$kJL&lRvTu9!;XfFf^;j;gP-0iX}I>dqtc$7z|)?uh2;)??2&K>mL6 z!FP2}$H|*Fqk0pXicr6PhS?wKwWpx*6%EWhqbO#%;%aqO7;fWIvLc?&ig37C;V&nk z{R3+UDnzagI4T`xH$QFLeXknHIm}%ygaO0;nIdWqt{W z#BgO<8cefgjy7Slvmc$EapQ5adNs8tjvp`~Tl@NcvG&_NUbbG?ThRDaVOQk8KN4#T|Fq3V z0D8{$s^Usub2zfc&wBOx^p1uD|F7*|2Z_y){r0vA#AkL*$CMLUAe@FKvjb?p0$YEr zSyxsnpp}OFOo&N};WIe{+J=~@@V_F6;)Gz^y@9cdpDkV>KSMC{@1XK&`dVF7qMjHX zv&X3ncF6noYO_g_Yfy>mph^0cMTw9u_C%o*|WE#q;NHq9MynnM;dA@Tg__hpCfo+GNO_L367&L zn7W!^{tSr&-oxei{zo1cCC={+8xjJqf?~w$%N-X*zqWx^C~Fs0xSMf6&1CFQWE?CA3iUyyL5Bt;L(SV&AW1Q zb8(D0VNG5p1L8&5=>4LF!AEp0HdrsjEC=Q_jGvJ@u(S_hSf0a{uW&?76iy;0 zLfsQ^Zlb*r8A*7St60Rx_f%9|PFO8dT@nWq7JJf_?reV;izmv6rn#C{!^th8!Nkxc zl0OD7KGeT%$tAIHre#jWrOb{%+tozHfPiJ-b|=5-{@Srd9L&ZKMw1n@ZLFTrsp7i_ zPF)vMH>7s=YrqInPQLibkB+(o~POF1cJ-NeNcqB`O_eF27l{ujd&Hm0`9dn!ILqQMh6iLDRY( ztT<1{q_R8d);x_WNcu(G)GDf7Gq*m~rX5^V(RHyJ>0Y2|Y@5*7hOI0Sy0}Fs*eS5jS>7s_Dw#?Y(2I42@P582^H+MfhMeWrxRJcw+^$Ar(9$Z%L|aN z@0E#0Iv|`+V_){7$$u>}E%zyzg^fgfwRN zg^oS3$;lKfaTt$iajCiq6H)%onWp{<%hat{#UvA_nV~G+vYf|rD!4pPD=_@{p?~kA z^S!)5SJ2vPi4o}j6DJ_8-P$CfDHg1U!5byOIC_*yV8sCVCON zPBv?cvp-9RomaWP!as>!lU217`S!Uw=d5y5!%_6EmrCm!i(C6S7sh>_Pk_lO39i#h zBW^o*Sy3B_6TsazTOBMQT3@+rs?BuRwvj}30y%j@>P3|=+zyDv1*e~1{N7;Q(~b;J*4EYSf3fo$Y!XFhVAlSLh}BWTeh-}+`G~H@c;$QF|m#)dFWT;9`Ve7D<*!R3m(LRFFCwCJ$gCeu-`qBS2 zk{kYi_;m}^PCJaT3CqG{U=N1(*kCyLw=Q1w|I>@5#;rRA03N`~S@R?{vHKehCNZR+lvT!3KuKsxLLX}0_V>H#ZGGb|Z?V(S20h|6 zzhe2uR7t7g1aaNN=+lULraLQx_2_pvUXvRZN?NY7o&EN0)nKm=W&-C``_xo{r`?Fa8`uWxzy4yP!bzMh@v-n^Z zzfJxgS3Kiy?wDJvW+})&1YwaF40dYUF$4N~^n} z0xnTc>SR(FM(wlSgjK?$eEO>BbjbW{7yhR38ygTFMw!`5OMWa(&rTYHE(HqRP{6YR z=v@sukNn-fCQ5sATtZ{c3{yES< z4x*ZNxz~AW6iQYc4N6>Uy$t+qFYC?A*ej6f9BYa*mKEkHO4D};O24Ni&_CE5Mi|^m zB)ET&sp{LCn}NNr@dL&f8j@Cm4Nfs@Wt4O{$n{uFDj)RzkH^PYt2hJ_0SYoXLBY(q9f%x!-mK~tP(HAXXh8bgu z|Lm7Td<-wlcsO{mwRQ*lu{3%wHV=ZxfuSSjh>DLdthpng&Mt+Kq(K73Rtka8Dm%;f zxENAON1XdWA=kwow3iYxF1}sGb(MrdRhG~wp%{S_(JvAxzaBnaV97CxkAlQZX%8BA z?4=-M83sx@XAbjC=+JBqxP+=`Fj7^6*rmfAj(o6Ieg`2-mSqsi;%70CRlL)*H#(E> z3(Lg4Qgd*|5F~^8|!1m2L)Z(nP_#cOv}-f6}sZ~ znn=*QiLGWFnzDaNe&`BGWGyxV$!Wc?b2>R=f~DJL=-|p^GrY2@lx4STNhW|Ql&Mi$ zt8Lj)^yW02x!1qfT^r+Q#vHp5IvPy%sXnGBTQ1A5kp!dGc~q7AwH{MkRvp55@^Pbd z!sc};cj;+~IiTzNot;C9K4adjU`1j{p zUS)Xj2737pzcV~c(DxQ@D?e%%@IOUM<`)we^&eCBpVIXIaK`^@(fXtS01)^;Dq2z^ z(xPsrb}r8U#X|j;5AHwc)BpAUUqo`PmaX#P1me$Z{n_254GwL>W_1^-j!}$e&)}Yh z8M_KqDppA&Z*+~Knb^y_($}ktbW^Rn^wkHjb;(V+_lIwm@9z!7j-WmmHt7j8FzzYH zto)qc&B5Gbe%D<=#-XD@-=`iGf*5f2ObB_#{zg#Vso+StpySMPR5#kbF8{#yFp8J^ z;vfhf83SevULQ=sFN0qe4F9&=`E>(-!}<1;o5k?VogF}X@XoV=5I_i{E(C0x3+G-x z^C+hUC$n|g8>o#51l*%y1$B$!0Vj)uS(_DIDYY54j{ryEtrMu(;Gje65`p;wef|yp zKJsg)5njx&xjcshInIqW9Cckw0$)z>Q?D#~23bx(#8XiBT~8!}odh}e0;C-Ylo8lF z&6?KCvDUON6Dm^#Mkpn5&b%?ye2j$#ESJyE7%s4wSi`t)yd^F}GY8mD_Au}eNteK6 zszawVLxm8L@EhVPZr0-t-bjJj;5=F!aXR25sFh7y8x8BtPS_2a9bqsCSZx>D*@-z^ z;YsuSC6Ln4>i*NqzN3^z?tZ=H2^(}Ih|j1oMI#K)U%=Xu412btfCYoU z{h}W`%XfAhzCe`_XJ#C|_-hz27^u7$uVfg+@$S8lG5F+%;NAgYt(^ROyg(b=4rrpm zMCur1Jg~T7<8W*)Hv8OqXE$>?41|KITK6W_W8^WyvE$D=8V#u99xfdNBmp8)hZ@8U z&IWl;r-`7(n%0$ibOO@@>1EK?qzqHZ6qQhYbcC?J;}=8W%q2!Y(c!1fiN9jg2ybJ_ zO0N4-R>4aQ7lY^T>+9$Fvp+swVDWDD-Yt#em=~uKy9_Y192*EvPcGP=#$|ddFptJV z+pQ^dYtSt%H$wg3{a-F0kKjSX6iPvX#!_`Pj0 za>6xw(HO>71qw;j=?3SDJYv`A3n^P2Zka1^~G6qDLT#O@yN95 z$0dQ|Ft{5R$(^D833ell#WG>JA&nJ=0p{2L;`N99;^G4O0g*X>U|?ejV5M|6J}WhO#Z(uI1AuLMO>DysD8DWfxC~DdnAfe>S;zpj$^H6}OBl zku?ZGmsWsYaS|UK8ED)$yc^ugK9?(wB<8RaHM?DrD%D$Z2!2NIzBVSWwujgX2o-_Y z%{E=Hbq-hzZ^#|MwpC+S;_QSO4rOkJ{ZK#WmBC+dHzYK)?Lem_{#@ zndlMG!qzwA0QWQ2HhCKxdVSy2xW4nGoQ9qCo&o%M-+xNyiv?GlXJtcb^c^g4tR5~Y z(>{{C>=Ma(c`hm&k{8-7_XOs^DlEYDg{+xM<+sd65Sj^1#LXGY$M=cy3d z!JPZ4RE+N}BlCAk4+9q+aUzp?5tj_;CAdmIpO9RV$LzoqU86fBM$}y@Wpmer7SGfK zQ_=LvuqBK~y5Iet+JM^?ZGPPo1j^Bi9CGU6s3%yz+(u6Q@^?-C#f9PG?`k}BR{RQWA4?^(QfRTEVR31xuq@ed#xIdLrm>=~9`?*O#dY zWN&d%iC7jp-i?>T^BbgmcmaXZXp};{^A1I&2{&zx=@-qdpi;-cYj_7p8mYf@tNR0C zB794l5p~WWMcxCs2QQW1u=cKtAT>+Xzeu3;=8@`__0Z51dPatA-18TTc4P( zc`kosH6iGnH*j)7r2g!~OH{d>%cAwZ=SU^HJRI8kKo9KYM476x8FG+b=%qYvVB6^a z@e0W(!#hPkUuI7r78fSTsuA24lw|>Yi-QxDFf&w3f6xZ(P0%Dj_O5L=`)HGKa zUdr&y?+-Uj`tnU)%<`nQEZn_qbZMr0Rm&A3 zPK<4EYYAVtpw7nkt&yc8N&Skw!A{+(twTAc`y(PV^8)9Q)X2(m?s43S!B?PT%40(8)xQm=kUQk~5YccFfB=8#t#NpD@N z!cM)j*#=i}-7HbNWSrDe`Ne6pC!rwtC<`UfHK7BgO2g5p-n73LuNUusrW&wkY7*H% z0s#C+-~IQ>57rm}K>Ytm`Te&r{Qs8#+~(1B-sDKS{XxaxpPoR5J)FL_Tb4C*DqnjL zX>L18I+{GD6irSTWfZl7oQkt!|Ml(028ooHbaV1n{R6Iz6ew2wFK~J9_*MMM+fA*m zUDd6ei8VM}Q`V5^>v^6FAs!l*jFkD6`vYJbp%~OYwfEYoIp|SHj zn4Gm*8pzuxZCt44(93iBtvsY2k*rNy{a85d0c8*XY6e47u$L|{=WtyCs5YH(o=9?P znTw8TphKq+qEF-GCyZ9pYw>&c>=^#q=b#H0 z#vFf7*w}MZ2-sJkw8FYoE-{=yDHYuXE#1JfgVzh(2K-JOo%kbsO%1~Qs0AP1Yyf5e zHQ1FG11Mf+Cyvbe^URYM6E={cdCsjSFUS(@UQkEjP-(>>4SEgwaLcN8j++|EJK6Qg zRRV&bXQfBc#2et7!hp+T3hf~{+*igOOh^E0G0wC##FaSOsi~tlN{TUW+VZz`8m)%n zitmet>A*2;dPqine1e!L((`)0zF>7n$DE-b^O=7lEx?_qUYcrtFRdtS?fP;+?$6uB z@;Q9{&*2klcP8x8Qk^p%u%D#n5+g(T5gUM)R~5%CSKST1aY8($JpLah(`Hfyt*7<% zfbY|Mx!(tKknjQnSUje{n5Q?4)Fn=!s)G@Q1n4*r=|z}(a41vInvE#4VBN?D$3{^J z|4oO$e&~^hWtk-a3P&uFf7WHv1`9mc z^2N!g=fN5A!|2KV+SA3s^}D+h0?|WZt+~VQv-arV2D>c39N&zYaCKbWp9uT|3hLqo zlM0t<>%-i=NiYmMY}lj_Xh$#~g;dU;!~6^3tdkz5?B(?+@zZQ7H}GQhVxSX6jRtnt zG;!d0oK5L@r95|Y4kaO(ea}xiv_I7zxE{=hd=Y_xUj|BbqPp+0F&og`^@@Y)L2Eo= zvFdHPNA%s>L6epT(`avJvC6V+SJnu!Mxp&+#qJ?_@3?oR1KRj$0@emTL_#np8iPZ9XpR zFpo`HKyN;_)eKsu9sruba{0QgmMuingKD-RO<&fV+JVHls`5dpS#D|Qs`2DH064%c zTfnXFwvQTl1JK_Aj6XTntzW$K4RfoUixUUcSm5}FO3P4nxV~b28N*7vT7&38)OOp~ z?E3X94W$fFE#rvs;G{EOBr!Pz2wptz`*Z(RqhKH)gx>Bulz+i>BKr7)jFi|d3<5i= zKXXq1RM9xdaarWf1st@^CM>4#yz^C$lh!;^A)ggR?l2MzqnI;^Y%pLOP1 z5N`-W=akZ1nNM@o7Uqe;F3Ia9-$=vtfk$Dn1iPN+e%*};DLU~L zp#^rY3m+X#TNrA~PMJZ9cw!gO2UJ$W@;5qs+xUVrMiM9u8x*N)-x~BLVqc%HEa01} zt@W$*?5KneA*u|BszDatnnQSBnoN2TFS#z8!2+#RqWT%lWT3#;4ng#kbaRj^@3@`e z#!Ew>*gHc}ljN2bnX;a>M&LH1#}E^#3ursEc$52LhzN^2A}}T_`5S4IFxUukO)x4) z$b6Q9^DWOYNAN~>^Ckc8G7xS9I~rL?62&a2w_Y}*)7ucwH?sYBzbDQ7AqyC_kl#4+ z`Gc2^P+Ue@lxnAD9YbaE*o?8Q-nJ3Z1$$MZJNxGdZxP0zU3!rF5_k_C!(0vLkn9Uk zJM3CWIEqs|oUpEKyXVQ%JbH&c>Au)Bv-|+bfDMYQ=kLr{m?~)1t;efMT<$1LBDNs= z4vUn1er}eC-SW7))=wYHt!CBSQs^pez!IArG?6;~e$UFpl-F)WV37=r`Xv@jzU(3z z+r`zGH7e~cC`GvsgA(Jl`tS>z(9Xv;7AouoZ;ED=o)TGFFD^4XW|(Vm(O%L3u>AJ} zH1qeng%>kk{8;}@hKp{U_xN_e$h~ER@rI|mk1C&o`2}~1$V4G2zQo|Q=Tjisr)YLi zlOLuPGsqhAwhFpWxS@3&Elw$+OFD>}+WRoCe~PK+4A;ePtQjmzj|aXwsO(h+1={I2 zxh=8&v}`5D*DrMQp^eU2nd;mN1WtNhWKSaM@24KK+-{x-xW;2JYq+v=lS|UGO*ltU z!uUQnFq(md5?YChw=K3DwFKcha%Z}-q)<$wjf@B$C2l3W<$mzW`rD|(SWno(uskiP zq($DGYR2hR=t}nY(TEM&AkK2Q3et$0m~f@UkVVK!@dD(K7Mqqk<gw1MPv1 zgR;Gsg|zasa*~U5be??c6|shfwe&dVUbh~zl4_T_z^GC3X&h=gy==R8c<4%y5q*7P z7u6J(woSRWX4f-}OASyV1}PgM8aA?xlluk?pe?q4fM>(xVSzOGhUWKxHOhh4R(Y>3KM0Vs67jYDATSPcu!vrIlZ2JzMtz>1NRMP&Fn zPKNZqf3S6DS6A%odEs;O7Y4uNah@j&1GkzR{IRxUIro0Tou@$z%V1=6F^U6*q+Gh;cv zHy-$9+OFy7vlBJbJbl>7V0k9}S`;d%FZ|M&)9-V;x+a`empQe5y2b&+B+6WxjJHvi zs5|&M1xiw1T1_3cVNBm{nDOI?;srM|7F>fMr>1c`g+zOn~mS6g39x<7862X46|Zg!?U zr97kqs@P7lZ10W&k9fsYk47B*rIH!!R;dBb+hp*m@|bXNw{-ORCj?W`-!_z`;Hbnj zjtVT;n|T&u&RqcemA=;(ntST$^Y<5dGOVI1;9NUo=}KKe-F?)Y zX}ChU*|ewDqs&TMOpF>!9jQ^hpM>d8lh~%_j`z7ZnSuIvryb zQGINFxV@I;;YH#a>@t!Qv6V4IuCz5U1s5VzY1VZ+!Y!{O14l@Hv2|d-kN2;G$1``< zBLryZimp+2O>tTvfk4aGn7*I327nA%l{q-9d?!7>x`%0!d2$t0o@n(eobhi|)xh1F zSwvj}QFu*SpzCA2X^V0a7A4!oO~W_goq%oLpbfU^YtXfbUU$_UUFC?DVd0)KQqsIL z$@e0-Z&yr(P8odAF0HaCTgFTm@hIZ^O7IYQWbZJe+`}mYCumDo>VY&A7kt`|# z;a<;e+dnvo0*k#$e11o4@HhU@b002k*Syd>CAv?%G9w{@d)4L3E`PP+TIMHQ2b+Ds zd;4rC@UUdd*VTugx-m+uDOe0Lb+ixC?v#Cqc2*FEb}aI)h?O~UE*Y~2scXE*Xp6}` z6$rKgL)hRMaDom9Wth+TJ}*Bcl8_Z4tGJODiHk0NGk2T-gdMi=;U z@^0esND%5ap}#HA{gQKUVXUG2a)%ltNyV4@Zym@Dn6)T(9xUVrrRwABxu%GinpvWE z&B`-E`Wu3zCEx)^w>k%ks5Q}{OT(n;90Eq8&j1Gn0mwFNvwQ`-KTD)8ylHsN3ESE&3gf*=r)x^I{Hu)XwD zyo196+?ryR^pQqfID+J>3ly^XL8MxC8`NFr4++oPZWl|z9+kqlzFQ`OEoo6F=GKi= zf#;Qeg$V!r;5G9;Q*M|j@4|`QBPvV^4E39uls@pKLATr1c!hh=&(x>KgL%n9K@nW7v^h-O~m%f2!KfF<{3}@lT7Z z_s5$jm!A!|GUUtr?4^P3yWRtb*!#PzkosOYv26+Sd<%f*j3~Y*8AQ-svVyzN_VZlsi@3;&DXKsf)G^B%5M3BAy|0-2mOJp1^@%)Hj_SEwJ<9 zehy6Gd)5Zvq|`wpB=#r<+DQ%QRN~|vBEo=K6;Vd1KzfLfQQsYa4+?4n09)=fWMjV( zsU=vGm-Ep@@0Z7DpaFA`8#g+GZpsV%%V%Mt>8Lsf`9d$)85kB$LU%o-TzHrgW)u^` zL;vtnHk{eQ`n^UH8Q)zjlhlUo0*;y-5y=B00{`m-=R2NCtXH5XuM6Y{O35Q}R^lPW z{HQmBwrw#)-}A3+E4bgQ#yto8wq&QcM++_6RQS|67L|3S6a(j(s)Uz_se8E8JcCacCM>qO*Sz-VV&CJAh!LREagmD{EqD z(UGX5gSpV~oAm2fq`%!WU02v;quznaD8ikR=^ZS%&pHxfB~A%bwx7g6VC8^7G0ABt z@#Z&PgG~nYnobLlN~mUoz{fqg=C}%%QI*Ih{O>@a<$+w`xnvmcMa%|^c{qkRxR3ob z-0qVepzC;Y1WRjlB74-U>{R);Z26p1NgroHgeF&8AIF(vBwq;4T@%-2w#Na?@~jDM zduEh3`<&3i`b+?m`sm7E7@1Zcg$nQ)IqTC^tDBV)EZbi&Rz6!Wof9H> z{IT!Qims_B=e$)$g_X(V3Vfenmg6$tPmYB$HZuA0s;_ujNAWA+^KL1+yTJkG-q%{eB5Qk-DjA3mkNGG z&A?93xbm}-fhlc6nFP93iJusaakuXrdansF^2oz4S}|$5(?}oKP9VxZkmn#R5t4SL z!LW~lOr%Q6Q`I#QdD2kiT?p*dR_ELo**H|}Hl>mcwqoeM1O54?>~C)eq0NHFj@vMI z0uy>C)P(akN9m(-`lmkGnC{)(Yk}F4E+I0aAyFq++cR(V_~ps(27FmD{Ccuu#4

zrQ(?pG#wHmpKvJQA%-eT$YMlE;VTTe&oIe_8o5id+Mw-^HOtPG#b%!~fQzHz)F3d+ z!kx^#0eTe6y32cWSId+g#CNCVc0Yn#eAjZ22p*l_$NCV#3AtN_aXmWrzJn_5@}b%_ zJ5+-w8v$hJXS67efQzs`2F4`j6U>Ws#)op3yQ51Vn4NsoiB#E)6As)UO#U0P2qOY71s4k@Us9u{h1 zSFZMEHajRgEH>D7ePm|>7SV$@mQB4?-aOuRZaLU`(5H%T0XK7qoSj}+Vo&lgiKgg2 za6)3l?z6BhEE5Dgx@mJs_4uf&MLw0ZYFe7v&EpY+J4g4jvB|bwF};u$fKF1XsAy3Q zXZ7;VZK9mc-O@o!2DTvCp=0h3(gC%jeISt;y7`K5H_ThReC@ek_o#J>xpJPu|?U;2JB&6#&YC z+B{q(Ay4Q1` zw>&v>$2V-V^oK(HjYC}d3OM@D*(n6L8+ zjFT}t{m!X?&`pV--&AhGD9LcXPw2}yHlFZoBC`=*K-+>JHfX~Ihk1634KJWLvpxa= zx4rmGTaC{_-}xIm%oC#O7M|V8>k7%R+|&A6W#z7s9a%}u0|i=f-d;16L%&nD+8KJG z$FF$N%b2^mwIJP;h{}bN(Q4p92jT#N0Z=i^-Hp*Vi7NTbhQ<<$Cp-Kst#mtCP2XKj z=rcRnF}lBLzup%tZ8^~oVXIhzhi~v(iPazYs#{}9&A6na6`FVJMg9u6Hz%GS{{#6S zV4{KSk5myF0Kk8S4~ z--nxn{r8_JO{;Gg`QuPV(?OMQGFxqeVJT}OAj`gzkFyx&PRk@>_{B>LErGDclx8bB zGuM<1ya1YBL6EEJrur@cgy8#!lk*oxMXX!J>FFto%+RI^cf(mCkD0_Bo&r#US(^|o zXTqabMjd3*12CD%>G}&mn21rk*eraxS!g~T3~bX=<--z=jFL&_fwo=jzhBT*cW9#d z$mSYjv*c@H&dnup%?WsxJMUHyCNk&dy>Hoi0ng&Rr0xHMwRZ}x^k3JtV_O|`*s*P^ z<8*A>wr$%^I<{@wb~?7XNB`$s>#N!|tG>Ng?UQjb4o1~@-+}ACf6sGW=VTd1lnfrU ztehB_*!Naw8jLvYatVonRfa{uTByV=cC2L6v<%JtS|NyL^s&pH9VF^ICF!C1fYno6 zMOJu4>>u`q{CibB7S8LqfPsMiUc3K%RrLW2pe6pFT-E>6oj{%HZwYInD4&}?gMs*( zvHc)7DI% z+q<#Yzb^l@kDs)^5o!#TUoX}>ybZ0q$lK=NUALexm~6#U(d< zRac?uKucL_ZNo3wJ{N*|Nk*S8gJu^6)|PC9;dASWq5h0^osjd} z%g;^M``5`t_n#^K&=1nvk)-G5jy#4o!2vlT1}Jj@NF5L2OO9BkN8&p49n(ojQsZtN zem>JH%A^zf$Y|G~xaGRZ1DF^ll+}g!6V0Z+6+hyWgu8xGYr{YgR4^wv-0ePGfO^mn z<++YrCa3`vfSlLDh2S1268$*zNs)b433l*m!^9TSpuh+@lTD&y=qIe=P6jF{5o)q^ z6Y*U$y+lNJdV>7%GLghpdp(kZRhSd70ifff=bhI;1ZKi~Uo>$yt0cW{llw& zNQBFwu*zq#_kQr`F?%$vfP+9?o&h%jIikx2CtRfHfmoSZQN_*u&^w^t;a5I%;S_l^ z5r@t{^*nvpu=?&%3A=U-pni0qYx1zI$Q{(ALgpDe6%qtOrxAp9(BIsBq)forK{O{V zS;e}=0E&a~E#O{kQYf#c16dHUM`7Pz`X}K!QNN&=bx-N>#!U67EtWUM9$bg~IU)=< z3~|s2MCCQTVCtmBn8>k3vgZxGzWs2!51kkxjkQCcAbh7xlxJC$l^;&+wT7tJwA*}y zZC-a??KkwTbf%8ygb;tq+nHHTkedLuijaY_X=WDNdWmgAdAH4M=*k?FUwNzj9WfR)1!S)xq;6Rmw&?*^H z_)zxD%KYXEs9Ci5##HR5&X_44HHr~4&p2wUhJl}t+MJAvb0jB15Yj8165C(cn^?WJCAUQ6b+lA*QY zNNMmhB5%m~ewNlpwH+&UJ_UEFFotE5VQ$4l4XE*@b!tREYzKtk4$N+GJ)5*aZzECg zB3|_Uu#BO_IHgH=3_6`j?|%|2M^6Id=m!q0IMiqNSsa)!B!{0mAsoGpnm0Pl&Q_*I zr{-J!S=ap8QmiS}A_Qk1hD*4vBhCUAzCbScDy4i~H%K^!HtFL7*DMTc^lK;D94>SAOeGXCpX`NvCEQ~iNZd$rl=@Elik$7x zE{THkn7tI~6<*3to$zrzEq}WT>5D_*o~dW&1__;i{HnX469x_AiAey54k$I;q1%Pv zXE5&|h3|6pEgIIOBEmiXMX{i1ett*7t(#y{MUF=#k!yim_sx(Ap_8$;(D`F!DNEWm zlmF+A^Ro*4+>Sht`=Wi}Y*6^AbMoHU>Fc51@;owVYtLFd$Z zB)g^3vnbL2;~BjWy19KW;u7(?;)b&o$21|16ypjz8jfS*&R$wt)x^LZq4rOWgZoXv z%{jsQwq!BeG3dkm=wS*S_HNCnFBUhpGz6RU1rK2FZZ+!iO|LVB!VK1l4IuU#Ef~+!cNSj#DMdED)wUHu&=t2ruC?xza_~ zJDOV52bWr>*kk1JpdqRj$ug_W3U5swuWHvh8JHYe)n12#e0`f!jw-Uz37}J0R|`xU z8A@dPnu>?chx?P}+xtr9L=N7S{Y=b_Ww&*`0uf>*boE4f%aPGeuZ=3j?~7mBqgeU~ zPBD2s*y?!+U>vqRn9&U4KI3 z!&w?}HE4G@M3sW*AhZkPFNFDTj`teyyQ=bt_*(tcS6Iz3A<5MthrJSYFu6a{j;F(} z96jP*=rff^SYd9?sEa-n*_nvXO+^T@@qcLfUV+8L^2kdcNrSyMK@F*zcZ=0<{&QhC zlg`E2v(@0`mLqy9&S^{po($_o-$!}>2G}&`87BRJ-LmaV^Yf!?y703 zCnton(`qMX=!@__(IN728#uZcSuLv3oKD#VA zptHZ4Ycnccdbdssf1hq~?i%ImuhVLl3LZ1Hdul~S+JD6Syl{Xt=q_uiVWmiMiRJoU zN*`?%I9d)vq9F&}cWp1;jm+@mHZiPE5%As6)5!boCs5>1i48 zar1LcQFRKWLqQb2vx{ZKsx`m5r3>WB`8xQ|R;~rNMFSFWhC!Et*LT|eE(PP89`6zz z^VQ);AG;|>t~d6tyO6*vzf&c`5pOZbR2e>;4@Sw$C04G4PjHiGarZq?tu?I~ycHil z?C$u(_N))x4TEQl6;clT@7||eM)R+=XJ#wS@60>SR2=T^D7Ni7#z)pqU*i+q$KUG9 ztrx3c=&z3GAyeBwHc?$$HCm)y_*^n%Lcl;B+h|x`R!md0Y*mvSBkqaak7r*tJ$p|G z?+#PWti4;k6OL26PVdguJrTrPZIe`hCBm41sfu!8y@#(ksVBKfVi!Ijl2^1Q_ZbZK zb^=b4JjNh%40q~@)rkmW;!~|8mTKCY&6=7{LGRxYz&At+slO2B!ai z$GwW=ep8F;kg<&erawkA zx8%rUfXLjk@dvXD&D=Bndx377uj=L%#QJX_AOgUW8`_G#@79v8=D$G`6JSVMeFtNX zQ?%2sNmk`xoRwMtnT)9DgaNzy#bJ-!B~)qNt09y%Q^i?+(q6I8_wrJkPlxO4q{zwS`a})JTzXpqK<16xSp>8K9C*EyuX}u=fpY{&Co!z)~Ms+Yg??)4!^v+Fa z8zqq3RlU!4roXeSZd7WLA8ddr3v|`gf2HVxf1?Qaf z=pQ&Pj#P^!ANq4g0Ov}S*bkvMa?cIUlN5>{bj5ERV)$v_Uu9ElY0H5dy*im16{5n{ z4Zr#_dGX?+iib zv+F9Q(uRMK??6(91*oO#s>YXg#Cy|k=L6S8iz#Ej5E+lk(?9DLrDmSd*;HMv;2?*k zhMcoz1^Errg31a@)ciy)=NJ8ljsxt#|3$~U-vD&1J_dfmTH96&8#d_b--<9!eFBS4 zO~i;#3PyY)EV*Zg;%YWx0CCs16JF~0sO<_ZS%~p*`=m%(@+Yv6MK<|}3f0F|Uz%zr z(uo=$ROcCKjV$liSQWOg`Va}6HxE`iNjynN61QyC5;sgu2ys2*#8p$ni&nGY=f;>f zsWZj0^7r#DXrS;k-BOf0W=r}=!zf~}my-(zX8n5m z&Bdf4)VyqAdsQuJLO%*#VE7`^D-7O^cH1s`YYpO~OvO7Gi zJ9EIwre2tT_&Da@eC#}E@&gToC3P(_gi+meJl%>PQRJ5t28u1Qy$hMJdXJt_tXqdAs$QNAtY>>L!4Xo8aTu zu*IAI#m9ZXRsjG$Ze%Rnx_#E`M>aCpwJE$`HH4=74Z($9taCETR5#YyLTEXzE`+{#V-DHLVHa}eOPS?XEv#KaQ{bwUosvi(aMZRz6&T6S zOI*^sjD}_o)Hgqcog;-4Lijm3y3<4eHNdE)ntIF`wCTdRW`b)GC=paH1W>N8`WpyiQikkRndCd8w+lYfA?G&Q;>FYzcN zP;{p#P;y5wmjVF9MLHv{P`?KXpg0({dXpe5e~TckS0Ygr*y-&n4l`564gOdFO~uGG z2qUK#`LP&RqXw~sLX$`eOiM{@E846=$Qz1x7@$jaNdsyaO=DCs;jvk;kvObWY+A5i zD0r+wFVZb|zRV<2twi|gP<(9U+q+Ll>6?s*Kcfu}6Y!Rn8}$uH3cY2SC-#R>&K_FN znUY(0WbruYYmBo3A#+qgM?$=_#9>*=KS2De@TT{_fH<-gJ#Bmb-$3kGSm1{hgo2dKMzF*&=bTEI!{L zULhAk;s+2TUF@8>x*w;QPEmGd(ZPnU>& zdZC3xd$f28N1}t-8g@#2fWp%0`63lY5uw<0)mM7;fOVdX8KJwD1aZp>0EmPC0b=dQ zFP7FEsSp+T)6PJ2K@&$WyZIVw+gqfHWw5p#g0|2`RpaMoA(9#Wb~LC+nm#lb-E{X1 zVJl_e3LKh=9!{7sxn_AY*old4<{B03d*sTWMambGF2VwP-4T@m!ZE6}%-R5b+1Aqi z>G0zG6D9FQ;q?VNm20%7;(25CzIprAvUCB8WvQ{EpvIXuUxeE`?I+=lkn(Qv)xWVtrW6~JxQwYTohKk7ucT1 zxv~WL{$a~^=bmvp4$(TWz-j%K-szkeLG=Q-ExPO89>pf1GZL=lW6EpCm7>#J8MJe4 z1U&e@{!d*u`O;Y;143!>nb*9QJZs;m;705%PAp}2GT>{##XHqCu%wnlVpfN zM{-Zxis3`u$<)%OCqF%@*%8Sn+Ju>#h-e6f`{AlKG91@PX z+2;Y*X*)fu51gRGTEw5K0jEFkgunkFfY14mj3rFSJn-YsxbU_v=-i~|jLAd`eHv95 zST6?R%#k>foM9?YBDgh1=Uxf!-;(19yvL1-IMzfb;=(+&HZ+JkF^yUA_y>0HFk^*> zrSs$2ng7BrWQ_OF#&ye&n~?ji?gG;wm9VWRF37t);G-)W@cuGYjt!MK>TleS0M;dZ z!C}kSg_#ug_mcNaY?pWJzt_k1!_8g& zD8WwENdc(KGP%031UMo9K;1E>r=OnV^?!(GSyVs)sGBw)h)Ut}jYs$|>Pi7ncfLe# z*xG`R##=yyJpB)c5l})YOiSg5qs9i<93RRey+z){Roh$Zv-qo~dNcK6>NZV%*cX=8 z6x$1l@T$|eXK^HkOU@P$gLTTTRrkBao6=xVt$3?oK+djWpq=FpN9`y%Cj&|WOzo;M z6{1~U*=N;?BA8Iidi0x8doGS3$DNvh8^>081G^eUfOV3%ZiX#!gpx_)wKfBvzIq~* zVY(7$Wlht>I>m|CYDNUOs8>~o^NbU?=1b4@6&PnpW%?Gd>gPJhzRPai2s>hN?X8@q zRi7_rkcj^UG^-K|CUDef!YriXn45$7q)U0|YzrD~^JRte?M`+bfVw~(T7OZObws*V zqRHY0t|OxtC)*>ydM|QT5X>_A#rYwuDe}!ZEfn~9>3sojjX%ZNr2_JCJ7&lP#i_XyKhlGE6G(&XPr#j| zRY^r9etUM?%LsJmdMWXr?7Z0v2;xd_$cf95s*Vkvj+&B3+%VO z%RjUOC$YJHGT*W}@hvXuxL^w6&EvC$5qUWM&+v(O47=XFHzu!!tL2ksWbL!nBBlu` zzTy2*@|E9{>XE>3?1hA@?wy;60FQ6e8AfSecj7jd`tCWim9D}2Ob(h;G>Zc5W{92> z-^X&XVQpO!p02fbdsG`0}^(y^JG4OVIt)tx=N0vTsOQt!MR@*^+bl9HdM;HL- zKAaeiA9rJ&`_N{xO!_covOMsaz5i3c$)z@`2fzXW{r&U*FD&>^A{L(i5f+$PJ2=`q zSpnwI|A$VHDZr4F)c@$E|939_zu4CSkiyQ>BLRlt*>CmCB`rWv=<>~o$%WQdbk`uD z2m?0`;$0o~bh&UqFS;F^*U;O11Cj8N6qW36H+j4-TkDgakLFYE_M0Ksf3-=FujLaiUE^A$p$tloZr zei!ZCF|!KZDS!V)sxc;=$KVQ4`;3)Y!Sp`RfriYk2cz={S&~5xot+wC7-gFqINn%_ zz_3UvgnFu1`mOL={*Wv}6Aaq}J%f%stW$~$;M`yAT!44B#z?wIRNi%xBkx$TDC?!1 zDn4AnK@ZN3gjpUkxVsE9*w8p;g8Y3$)Nd8r1s2 zG8Y~iLMnSDa`Z4r67c&**Er{u@f@B`?tm;x&h)(#mpDsT5@3INP0uhL6~rz3fW;*F zH(9_Rh^iFQfi%KemTDvkIWUDv=N(PUaQw&Y>JdMvH^5K5s{QQC=w?k*2p%{HBD zA-xH1`AX-}P}z1;q}IL~;=rQ8e5vST^-;-CLZ~)lcH&w|f-O_cc7P(kJBI=>%*_2q zKM!dGsmqdneO^SMIkq}!!a%NO(CD_tpVo}@>e9}78&@6*+_ z?aB?+a2LmSdsm#KPXfW{sT&8S-Mw%_i{wrs{2pIPRO|XNXP17+$24)%Ak)Zc1IP}h zle#4bt%>S=$J2H83no{V&jqcV<20-E|CJrQ!FM#b!#m^H(IG{Kcq@oV4W-`<3PQvW z3vyXvf=x`!&nQG3%RM6)I*T1;XgE7?8T6O0n)X?fSu(bDeYg$KT3_)>4cTl@{&w+X zNSEI}-*g?L9aj1AXwB@&lpY&P8@N;Ov(A{RG_Az5_qsJSP*8Y| z&guK88;XHyW@(3Vm*)8lkeXL~Qeao8Y6l7&uc}2c#?knChR36FAkiLhyX2AI{Yuik z@NaMrw76u-z*0rbbL>cq5$xCsc=$jaPu6WLij=~2=EW#2O6nnl2`5!!aUIiExKYnk z0`a-9xPbyyck!Mdf0Kjs6T?qASB8ir&Qi8=)FpV(Z|||54BxBLlKZ1 zBmoU-0-ALZ6lP4(x~Kis_VqWczs9Jpd$ zjfgB4j1F=|;(yY2VNdhYqYI?=t{%ENGo^#@_RPj^!jthYek|JdU0#y8G|wYT@uBZQ z;|pQ#R_>ez^~wk%M6|*&mlNJ2lNy3xxeM(5D>;DsS90)J324@NfdI`q|EcQDPhesX zL83&}w!L~}7(WOpt07Qy+9;!oHVt&1Oomq7yl@;#9Pt6M@N!v!CSWrNk^LD5?2147 z#EAH@i7RM~w1*&lbf87~5N`q}m`p1Vv5jk0>#su>4Vun;xccQ*5rs_xb6N!K_YaDg z4*cu+sC^ohaHTHX?ko1ftHRG3MV_o$y|8V)w87^M>!(j*)B{)qy+32*QIDH6eqsS5 zP|M&HH6Xz-=3hy!Ay$wIxjI=n|5S*ob!!P=4k*+?$t#sjSON93E0uHs6XyRzN*_o*L2`F&5+bgL9I-ByE+thj*|oQ=QV|7jQ|fp- z&W3{(awL@D)~Gq_0ZrS054KZE@sDX&PQ^0UH{8we6DSr5|1N1iFc*ngu%Cg&$}7m> zJw@T7Kq|~zZ?k=k zg>#@Lj&JCDM$fQO9V|(g51c8UIJk> z>7Fn}u9XWa_5-FtPbWHpS1vRZEEu~@z&`eKLW-->PU9gEJUsFX` z7Mc_Y80zKq%hhVBV7cONfD#AeEvT(1=-8>Q{fzN-(J`D7MEiQenbCq{qU;3w(QaI-e~R_nLZb{p;0-{rJ~E@;*S0%{P*IS3 z?~x=?(lhZc4f<9j;FIh0%baD)Q?`)gRs8%rvHO61-VMs7{A`u6GGA%7_b&xAvLKsk zwf`>GOGY<y$awGqGKLg2=t%0ZMZBu;FJ`DlEpCN z4-U5Q0P{5kuiGN#(Wye4L&(VOH6ohjjk+-6Z2Dr4guicdwJ7o;Qv^89eE|>uAxM}} zZZbF<^jJ>)8zhjt{{B~x0NS^INdZCqLdOPp#(PldlAm>rm`1uwp;wL7)6~?kM{x z$XN|OLYTbsw@GK^&HcjLzHWuHodVrD#*_?14Pn5Fm9^#On0&^?ds6&*MzU=qvky`^ zL9$)rNk@dI|FWgRR36;i?Fvt9JBY)FdWI+IYeP0t!tC0c=RnWMqq&b+T12b+Rw^G5 zz9?qKL>?q!hfe{%DLmFcCd?-rgXJZ|CtJ=Ac-&mt(#a{zv8LklNIEWAAM>0WsDJ1q z{CM90-bJ-+7^8`jO$tU4pNx9rEfun0eoF7{+8H+qhXy>DqH6lTlkTiOl^;08G4mR zYGOnNe;j{4wh;{r(>uKZpLm_*S#pv3UAxiL4d0K&7t-!PnRe^6hs4=Eym$hFp$mo% z+<35m_vp)ZHSC#LfF3<)v>e&oL6`)pf4uQcePH7cLr!SaTs%342I?7QbAo~xBm$SJ zY|0r224o70i>nxsq{CfU1*0r9i1XbAY_rzUWa^(K8q0Z26PrqDK)m1tQq()5X`Jyl zUNB#MM>YX8>8HpKDzAcEs+CgCwd!xSjp)ngSE#j#w#=i-HlMC0Ej`3%q z&O}w4Qafc&M?(L1-OKwY*_}h{-L;L6jYbY!6u6la^@Rh20xjnRJ*7G6xrF1qpO8*> zpd}#_Dckw&FEp=C`3A40)AbfN;KYZ01syQIBr;)DDZsPd;rlIWnD2=E3NM$WMW831bunO$u!%*_$)|t4444@Ngc@-t^~b|L+>z8&IRieB9e7 zJVg7r&Ttu?JxsuP;glLC)H%&(hU-e6_8e@`9+n&bf4uYDG1+uO&{+4bSjb4vN5?fIp>c@NRRMul5r5689r z$Z7}!pqO-hv$k2+?#{lf{kYW2Xa@g!@ye=n>rZ#D{d&7~zJGJ-+~$Yu>L#x%-i7yW zkJ&yl8b4#CdYlHd-&Lm%;5v#A@yi9<_3h^uT|i{~-`w2B&9yt$E!IN(*{G)0d78>z z9@;x+O}9UOP6E12xnq_H&h3T@ua#>T51Ox~%YF8}b)Eqi$lr|Z<2H4y)nl_)lUvg^ zPa@xlCcAPc*Q*zA{ge)Ad{!1Z%(gB@T|m8u#~&9n0NT%56tO#NfcBHI&^BtMGYFvl z#Hjh`{>|EpH=c6!SZ9wMx@40ft<0Fe+s;D(>C;)2{Ngl~;xWTvcusd-v&OyfGFfI6 zFi3?F9pDJ{6*3!}wYZwULrso5#?|$`ms*cI z(;zT6W@_bR6`kwZm8DzPG=%r&W0yOjAZ;a{bhHl*zK_Y^x ztfULjx?@9cfS+Iu|K0xm=J^!1+#E>M{t>W_#nBsj57geVX9|&)zl_(5yG8d;4(-%5 z?H~SE$*G(j1|T7~c~vjzI)xwoYt(eutUy!{YyQL|<07?MWiMQY0F7p|_Gy>kZLxm` zv4{@8KMsLFtzr3jbO14(D+2al8*&a!9#Cu`g`t{U5}U9Z!=;zfc9-4@3st%E$mQ90 z$HIhiEg~*3Q(}?fLw#mLaUh!dTa0t4b}-DVI}4!CuHR+uBi^Oy816L*psWZ1y6>E! zL%?s2Za@m~LBv7C;(x%Wfwo1Iny^BfVr77M@g&80rcc-3;2O^T>8{GnM`=}hf{g#M ze&Urt|J(Z6-XW0J-i@#H-_}nK6uZ_5J6`_Ajscbc;}ET|6}1vMqhvt;Fmr)W(1x$%AT6MF=?yZ7BTZMUZOq->1} z9CHN9D!R&|oOV?7^wC_lUcrLv*7YC;*pr@PjcO008x*6W3izjA5LSk4_H4%v3u_j( z^t$Kd&!6j@382#(!^0#K)dO~WwKtCIM}x;e)QkN;0oG4$+rQRNSb+5txs8U`aPpLR zeP@2;>pmX!e#MItQfA{P?#P1IoL@$ZY}H@ur)%5(s?yTN-d)<;cV?Us?Ep|F!R@_@ z_sAwuGFe85C9-hQtd;HX{~s z$@jcLH|*`v;T>bWB&G>+uF3r@Y_n}SYFtK)t{KOYzHOrFg`?tf#p3l{`#J3mifJ7h z6m!wiFXcxcisOCMEph)=0-TFmJd2Ks%Yj(&ewM*OE)xqJNZ)mHLH9iWWX6`X6fV{= zm$hqFz;+X6mWxeW*UV^Kco*vEHraE`nh1fB88vqUc*TV2ml?=JH15imfF$#sS@@Uq z%pIf(WjE;RG3Vp$o6u|*!y9OhPYdwRisT&ZM+A&)k9tIa5LB?E7~*-#I9$%qfRD=z zEwo?^hZYb|{7y3={pP9A>#w$m=v(Uv8%1UyyH6FGTu1Uuy6&vDnSx&iv*?Wilt!92 zn>_(y!PUzot#!BlN{d{>pHn;PUsHySo@kTlG4kFP&@Mp8c*x2o!iI!<}9OFg(Jr7!LOp zwvTl_nZjLFARi3`_E6SYNqX+WE=hVU(_7|3eU^Ad_h0fHxD4{Q@o}`z@G#t9u26B% z3hRg~8kN7B)o16GEz;d1T5T$q8!w@%?W?q>Lh?p77^6l@i3>g|f8m54hgj$g4s5D|1l4qYRbO5dY}gZ>)c2HUGE@y~~QexQ9`1sjF8WTn>&G+%hyEKFP2$ zOjkqFBjs4;2JJLB+dO^>$)X~FI2iTre%(3KI9o=UJo(dibCuuRtgMohV$<`Fla@HR zyQlRB3@VreODyNehT@Nk9$1X}kb_>BcinzVGE1UZb|R=; zfjTs6CIE&O|Kpw&xG&6ZGzEc9EJs{!ai2cLtvw+O-_Yxh63Kv2>O zWyK9;?c}HV2vfrL;H;(LoJS$w%zjGr5S7!w4(3+0biBr9d;@M&_FighxP)F}Bk{n#tPg~htfnFHuSA6seHbkPiIyph(T z&g6bc7A5BsI<4lJviy!1wd!*=hcUls#QAvFWv4*}MLUnDc}4(P&m9kKp+a-z8%}KF z^q*0!(Hf7;oo10QrP;A6A({8)$l0^sI>hZ!(aGhL^q6JbGNyuR$s4tVgpl0ok-sMx zTJm>CR)Azuz)vFZu7=*5KpW7;{25W9dF@|lYy8UN`#OONY_7M>2E2Ap=pu$-ttsBy zxQp||!d!~!X7!Y>UFe98RDu~Yak{k+*3e~0Q)Gh7cgxB+>dadB(3>S5c7 zScl-Jh<9Eu1A)|ROs%2z_5OWK(OJ^eS4hPy=cllxIh(?4Kr@!4)peWE!L7r?%%M8G z6&$RNv_1>8G|55&efc{Jed9z{_7+5$gdtad1i@nVxl#l({bX$G&ON&kYLXdJdL`ZT z4^~iKh5}ju#TayK6| z3VSSH+r!Uuu|%le_GrD@acIxdM@9pjAzBw->spIy8P^P&dR8X3y1-~!eo6)xhbAjF zjqn3#r?_RBYdwuH=0sf$%QTK50X%4%<*IH&O-C-Ij(UUvQq+e^A!H_(_E0@bM#L!Q zut2lo%9^EE%1J?m8ZcYBw?Fw$6BnClY-{;=y;9$(%zc!cL~V12_>sa!brQi1WYQ5a zNNGbJni3rn$l=@#P0@a~$7gX+nq@g-k_H;zI=2H?-SV#gBn?aFNygdmD;d?I)Dx;j zj^LW*W_W?Ap`DQ42DS>*m88jAA1^|m;I#siPZ3B*7Sl@R?uRO@lIJxClkfg>!~jyd zoF#$!N2C5ozo7!E-K`Z(SH2`*#{D`XDcP+OsR3n3kWrLsiqpzt*&gr`DuHz9f332H( zZxEBo4~0=4-ejC4!ern;t>m5r@?Np0QXr9W^3-_Q6ROMC`vcP-7~!Xs-;wWoN+|S; zO+)U{&9m4bmuZxL5ftvyx@hefOI+Ns)*#m3hJ1w^+kkPx`KML%L`_3tQCXnM>(wU* z1H5mh+>ifALU}>&MrgrYF^5!rz=y==o2(6)D^D48nO#|6l_V;4tY#RX$M&$l z`Q2mg@)%;-=_d4bp^GIN<@967r2smCG~U$@NA!8GpZvNcui}~h_OB+?@9ZB<=*SpA z6B>3Sesf)+nmwDBE=i!@`_nV4c}Up|&9y0O^uR!XxN?A`@=ewi9L#)dhi?#~uxto~ z$lMg=OKzD8W>YGW4v`4x?L#a{2BY$Q>xZcDSw&aTtl5#iXAUG*P!%La<)3lxHrl!f z!R3C>327uDc(v`#2S&>j-;JjciO73D{)5p#z&{rvP|2nvi_|`sI5OCLY3y=SncpPW zVAF|-`bDh7G<8pHL{zi8l6a!+uuzdAnjLuvr1Qyc0U0-A0TDzAKH0y;UjyQjN#z#8 zErp(hSJ2c}tCE)Dd(wE?`NP?*%nz5Luzo@kV!yYhjl@Jlg_jcL%5Ms+k_S4(IGuzK(D2-s*)Fj zqH*=H-@7DYOY$=Y>*aYT`z>LhHj0SFAA2~9Xb;`24ttcN84(*Mgijz$eu6B4oHt4v z$Ze}tI#D_Zty)zwvphzh?UQ*D>0$N1tVQN=Q;2-9U&;#1@Js zpymfiKQ=<8E>g)!sYY%(xH#GDh*KOgkKA8TXd<*QwEAH!OR#X-}(%CIianUF*ZgkXKoet`%gK`ZV9S zPc#SAsXqe^kRkODIY4@$CxlpKm*3jlW9}A-&dJV0H@|9sMA%&$wuz7kb(p2F+jg#{ zq?ir+{rMivgIt2agJAi@hA=!t_R*64TdCO(B(cUsH5Bg5|1zrMTHx2joDtCjXZzt_ zS7;W%6;| z!+9qpPo0A>eNZ0^Q3iwOF#uQSIfjx2lJHpgQ5aZLZ{;_B;8m5}gXy`22sv%@OOI)R zQI6TwoDSp`*b_}8^R5Qz@2j&$mgoY258W-D>Z?*0_Sl(t*X^h9V%;g8keJ|8q@k%I zB{ycsH#5r@Bmx=B&?hQw2hw=pv+9naTY^UC0BPpz&{Cl93b^f9tV)|}%y^TsG2ZQ* zylG#~uFm$}wsy8o&H~KzO7#kSz)*O@!P$F+0jlHR-0C+GGwl;V&QZ1HZW68Qy*09t zM6iv%pW9rzp+A8SC3@)1=6}xzNqwi=IHtgjSEB*l;h=X<6yR43mxHu&$wcy?Fg7g# z*;mDD47>3UX^Gf}$38C4cbL(jj%h=rzt2>h!);+_FdzeAIE}t-=uB6o@co8eGN6Pv zoUw3s`*8OyZ9qCRz9Fh^5(2IB4)5Bh&}PqAByI`y500#vP-aU}slU3LgTKGx7Swj+ z^{wJbz>&8oZnXq0y9gVu*1nd2B@GbVNpuZS_u*hb3wu}@ml^0;bim=x?KLQrn^M#Y zLn<3*0yM(;Bg8qRHbt=%@XoF^I}o1Z4$>LaAiT7`ZJS#uR#-&YF$m?vIV>~#Kd#U= z82eU$EA)_Lt8USjUX{R6{T;ZVz4#?4zrKLE;1Whow%q=chRkj_R`WSyiztfS$vhEqVEDLczT;WJa>L}=va+Q%swY71Y>T2Md zH6lAp3v)l5<*3ABEMhl<B-dASK3W<5QA_gLH|xz7kGK(ZM0a5Qe9C)Bu?urNDYRp)}%Pvefjv zh(PEFjyVHVp-{ba9Kt~|JI?(`G(bfhOIFC*AT-_l$iGO!VtSII8dgCRy9e^XrZp)* z>n*e#{kEkdWhFoocNY{SlUEz2Dq~j*oi{m@h8V2f7*RoU?zOYjq`Cj7KkExq1xBRB zWrzTubaM(veri}pAgIhmf%)GKYGz@1NKvY4N}C@_+PBu(|6`y zgXjI&wr$(ClZtIs#i`h~ZQHghwry5y>q&lh-!nb4`k+@ob8!6w*U@*c{o0>5qV!x~ z5-CcjQ#vnie#p}^E&epo6*e~&H^YN%oPKlT>Emw^G;Nq;_MaRD7Jb`m)2N(zA6)d& zE;FV*faDfr-8q25OCJsyrxwa26+70ZNF?QLnpr(tU~GrZ9bN$c zQ3_SnE^DhW{w{?s@cz3LdP+(9PbpLz?2i{)F}O&nC?8QYh{UiP$FjakZ1gS1FW)X>a1gv_|)<6iWMD z3KgNdiSrg71v+4=!yuyZl_dUw-d7avt`rJP4K<17Q^=8&TzOS-Kf%`;45&1N#9*vl z>nZn`-HR_n60&)9JcJLLMRx4LSHXxh?HMyCVa;0A_4l(?fHhRxku}PSJXR+@UBpd} zJ2aDOy6TB0)W1s>LOWt2d~csnqn*HHDAPKiLe<7VQ=-8u7@sfm4M7n$g(K$0MZ0!cZoV zHV>b4(!J}=PdU4-@5IGF!$dsQ(nwW{grRTWFGt72_?FV}Xry>&)Mmbw)2`^b4qCAVcGmPmH_1E|#2KJ10&7u@P<@vUc?r^i9v*2A(S`OJpeMpp z!Fh~zMiH^j6@3iLj+Sjf&emL(5`vXj@fQw9WOUQ%1SXmBsvx@LL$+x0^s$h1W=A3} zv(ZAMCc4FM#`!q>I(M@K$5$CzqvFDjwz6pJO7-M6QaN^1>9t%|M+sisHouB0&qqm? zY>tVEJ0E%@0o>xROz7|U!_dYfhmX{NrLI81ZcAtaY-c)>xhqm(hvI|*hN4T-q9vUo zagp0un_uXY>chvR!z1(JUzJet_#CWMp2n5dzAaz`(mUbY;Ehd*yn)wES@MXDaaxwN zdPh^R*gjn1+1b=C?6~pq-%RvZ*rwLGx;801wGBBDPQ`-G!@gC;T0TLkuig8vFL#yQ zdIA=Lb9G_Q#!fuf0V}IAg=l|Y-$%x~o$i~B!Zn3n@29mUpwQ*P&Q3BRdHlR?nmB)V% zvP(wO+MVterSc}Z`&yaAR-g$;@*N3f-#?B@rz+SGFmw#htU+8Ja<>vaX>AfBdr>@E z4V`asB3j6Q5f_(x!J|xx9q!QEtZ~u&)Om<9CUYB1vrz>ORaDmO0s)B+0CKtnED+-r zDZ|bDi^ZoinEC4-x&6{bvXL28)iG`n3>}u1XN&Uyj&p2Dk{7WpNHV$VbE$i|@8%}L zC~l+G0`Tfu_>2uF!wtPGRKw~gqKE(sWhrF1PcgZeBCRev$kOi& zKG}Dn&1cED-DQS576+jQuks^mn@djmP8Ds4%Ew5C2l+X2k9V3lVO`CXv07kRW0Ug!>SjpxN1)1x9Fh{3j~p9dGgED}dIiou`><``L6 zAliU%02a{d$Bi-Gk5j}1klrI$X|p~>0R=xg60%li@5adF7lST2GSlVOfvz{me?_{d zHlUPwim+w2bS=+bRgpQtx^jg^${(&I7v8y5tb%+#kI$D;*J!7OX7S0BGkInSCBS}y zwym!WqSBVBhRclHIh=639Y#AA%;`1|s(uK+%L%W4e*NC%{-}v{cRpEPwo$DurLcd7 zqLyf-VA7XiZJZozPF3r5o8Hzx!hCdXe7@W|e;zNbdA?~3Ty7p7n64p3b+m07IcwCS znul-sY9EY|(jSWx0Y?6M_VGSWrvJqMM$7~}P|Igukz6diLev@qyszk@o!zLp3&?M$su&sSnc{#NPmcAijZ5kqtd*Y|p z1~X76bO<%7(fs?J%;Ov{FDyF09>1=vUY3|KVbaAVzfOr>fHqCZ!8Wu@Ye65;Lmw0e zYVxHJ<7?$-6iZ&PA7t{!hX8v3xYJ(xZINd>C@kD;gF!pmQNmt3tVgn|A6V7_8=u~% zQA1JI_A0xDl@1F^2#`bSqZrVMZr7gSsbW`-atCp^&m`T}Pfg-a`LLgCM>BbJSnZ8^ z9WRq?embDDK5|%>JIR8>?)C@OO@Qh2Af+p2{pKedTyHiFr~8aGmdQwCzp=aoQnvfk zCQ`;|1Y5;|s-z3>f*tL#DoXPKO`#d9@kjpbCBR%3=R>+?#Eh7~J(-A9;brTRIcHlJ zKiysYGTyB}KF^f2zPJ$IcVg+llSL?iCAcd0SDypj>wmzN+J2#r23bWg}_h{GC+SMlt13v!_9>(yF?s#j8uN7 ze9Y2*%JRfcYLR7o{IN%+>&W`Ff7fS0xB?YQNE_#-Es=t~g^gJgyY;#^g;YR|m|LDJ zp}sZv0vI$%!ZXwu)Ndu%0u*E&8ty0{xO%IEHsp%*j@~<1oa-;f`^KnSm z$*Bg~8@1PWiycPdT1s;Gn8x80gk)r?{rG(E7Uha$BM6>;|J0TVlTSu(Qc#e_1L4c1 zBSq1w(N%$aV5ny;8-@(#k1Ws*!}D)$Y{}|{-~*)WuS{&*85je3`iKkPuw(#~XI%y( z-`w%Iy0M6FyT#7}GlDVfYZ1*ek7NP>lhGX7EBcQIvk0OyOgRaYZ+cHwe$6~+{oP=8 zuu*GOtNROzG2RPWC5*P11{7~KN{}dFd~F^CltU6PNVD{KI9oq@F$ljo37L*Kh3;4f ziLo!yU(PhT2q;_kce1{b>-aChPgfg-gb+v!c1y5r_Nq&8$D5fWAeLbliL{_9cJDbY z*-V~v;pMX26k`c8-qv})`_(RTnw%y>av%0|?jk;o-nBtLnsf!Ty;nF!bOcacay4Nl zbM|)J08kD|l8~7+JCY64{AVNq;OITES{fIW%)cBkkHES{cp{FJ&cS7~D@o0uEF%T{ zLZjE1Ln_3$SXb@B+ud~g#qXvQl%b<-P1M^*R}H~Lo&}Zo5Ppu@(4fB?ivezcX4C8w zuzZxuTa$q@aD%{Dax*N*@KB>9&wZeje;xPPVCG&;s+aTT|?@tsH ziUGr#p$62dNT&r?QNPy8rJ8hTxr-EFEnC;+6p=DXuCC-`zt#<5p{Lilo<@HuMY zJ3XouHw%PF3SUWQU#+yiKH8B3Y~z3V6VGRHf_N6sSmVuKbz-Im`xY$g%JLUDJ*G4n z;V5D#QOK?}D3*&HrwQ^R;{RER04wrI1RS#JQnN@d*>H_vO@g+B$BR54Xg*7!%u({|XDJK15vLLTk~s?LiaS!H zOW9um0~1@X8iF4GvN@?=(t+k{3jRAK0eD1qX;Fo$`>>Q?_a$?i!YJz9gNM+010P|j z=+&J{gH@p>e#*X=OSjeV`f3zb{gcGT_ujF zvl1{#JEb6RKrA?2ND(l3^QGw1&5SIyQgsj}txqLzEJ1;h)9jP(Rhr{uOyi`C263U> z1ZSkELQP&Cuu(zfs`nFTsqEcJvwg($haD(&Oy;RtSvuKmcCrAR8=5OxrMNr|d?9Gr z>(ZhftK-xu&tsFX<*VcLC^yItU0KR?CF}3{{w$Fqvrlgv3Q%!ARLlLg4UCK=F(0(+ zl(Nn}K_^I75-8S{DGp<%MvHb;c2pg>2@}}b!8zG^o-OClBg;K97!sl2D9M@cMXcwq z;q#zC1QLEfjAaXB&tO-g2~N5rrbT_Ea+MyiHy`0xQJfc7!3-5a=)MPjvU69nB1saK zK3Ae8eW`-thNNtm7L76)F*4&cz;4c1y!MEwWnrGwPLat4*B*Pf4-Si zFm@&P&jQ*@%|6AR>qYbNd9R-1PeV#8%LYXM!Z=fq7q81{x>zctU2u;BbmK~EiOjf| zDq|>*+#ef{wlwX=K%x!W=9$qHb`RZ`IisGy4oS@lE5u6%XrYxy=Rg>MLU*M4pveQ5 zdm8C`+)5zraNe6(+luV9!$o6BQ^jQfmz3fBxk) zcbwSdR-8KWHLFP&7qk7Y)C;|r(2Ni+$?P9LjsjkzyLy}#s(MR;{M@n#t)&fFd5P3* zBCxI%c-~F3L2BhswO*Oxk?PwVM>d-_{ zuOlJ6V%C;8^ow6Pt=WmfJc1?_hT;g z<*$1|Hp*PK*&$H$K;QByDKcd*#GJFc=f7PWykhv}{dVW*pdj>L8A%rpF<{3XK9G{A zxes6UJEhvcmqs%~>L^p#(B&rUVr3zB@*xu4Bt*|-O%2wj`}2zoT<>wa?DmzY#ZhN+ zRB8Ufwxw>!3j{Dyqk6_46dj!vLNpQbK(%dUMg1r_KR__Rc^HEN7{vdGdIYi;nujFg zIgPr2$DEu}tbrAxS z3Epf-CvC0_No5>!8-!O(E4%NPdwCHa1otQ^T-`;VbR$v8$w)2jK~(2QTGSO082Y-R zspXoI`*xyw4ns<$C5hd#>401>rTT-I89F{2F-3v8gVQx%>&CZ&h3<2GA`QQSbeHPj zEu-s~Q0JpZVvMG}7lb^k_7rIq6zGl7@3Kl-b`j+AzhRVu7CAmKV)X*Vh$_T7iiB-J zu`lI~-V1|M6cAqRoG)azqQai-&v}I1_3z%_2O$U9MF6L-J+klP&j0Ht-&O|J24*Jz zKc0N20|Ef3{m;%||Mi5ot-Xnpp0$aK!++~k<{2w1-Oqp!bomj+7~Gkv9VqL5y+;rd zUa~DY=+I`x{;qGT?ey6xt9g|J;R|znz3)l>ar1C|c;M*_9{Et)aWw|Ijon8D`g=K^ zC;&`D0{XV_exVVt8Le?a;(*sk9;mO^aiQ0Vl{*!DI532Wgz{9e2{*x|=P%wSo?fvJ zW7zps$R=$LDAw8zfJ`kz-jT#CLaA?1DP2V4#p8$-TS!G;$JopJk$R??n(u7=0oe%} zSrM_zTl69vYNn-TAfV_b`5Hc#T+uk{Wz8Gm8PP9Z`%f8z{V$c?3?J5 zwU(h|GN4?OV6L?nOE^^M{0GtRB_SaK1Ed4cocTxSPr)2Q@^+NlYmhL^&COLGUmRn0 zzC1j={e9URh_h<5dQP^{z1EB9T-{&6;_n%<+BC6j97$ul)b(z@wDwB#9)jy1tNJ_o zMsN0vYmvUtdwDt)zh#r=kEVG9Ue08()-g~F{?t&?)=^q_vz<5Imfp6adsyD4aWt|2 zcqaXD;`3+Mb}a8@JgvjyU1x10*|mM-_JX_V=S}+3mMj_g1^+KLjmFBJ^9A3GzH<5d z7hRtXRu+LCI4>VPLL>f~d^hJUl;-rPNL6}u4%k`7H~c{(r%mH>CNqsjz7lLz2ih@f z>#(}vwvNo2KXu0Q)u23U9nW#q@U?(IB0y1GQ)V!rxI%-e(|Rh~FbZa>P#A5~P^v~d$$ zNjvFXu27W&_&Uxw$zK25`YIIUbyO}5Oz`pms8jZ>stH&vTG@kTEH_nj<KwRos+KtR#2*3~vKcTu^c4H`RcyF@>-QhV`YlcsS0==@4A60DaB_06*%H2V0WH0KPPUsT=Y3#8)x$Hoq6yNkE0omV5stlq&hF%OtNg$-7@jf4}Hv3fG9 z$(WcvfPicah-f3#qXnyXa0Nir{-X2-y2NHed~(5GVhLMl5{f0uc+U~RI5k(mvi|-M z`6LAZi9VFNii&crJR1DRDr>%O;{n+66YKGdG$03&;f0vtC_pU98Og@92n{5Gv5FTM zu}~er2=)P30B@y5M`qLRc`I<<27R#D_$uwOz=HaQfWZ~2ZNY`NGkO%_56H<3lV6gy%`AiPF~IE-4E@ zCSaFAkrqfLPE@r7ItgB)s%&oe(`h*|Bva)PAd=)b`?X`hnbt6J*A}1~8SJw#C%b%V z#cDFZF(Kqd&J0pJi2MZ*mTM4iANgI&q&2y>yMKL1UNQUU`N`hG{SAuyfIvM(td8AzI?Db2 zz6a$wCYw~`qgB_c|MsRloLYH@RkT1*T3f%~Gd?a`HgB$LD*Lj7HOqOJ6(8p&dn%60 zP8VOPz87i~vV3IoYZV1~uzu;qmaj?wqwnhngt%_3twH#-)is+1d+`d~me@zL8mD0N zMzj5PzbC0c(FHc3^ovTtFK4B-JB|6_aNN+A{e^Km40y|ZimIpR`S0_;HM6IMDd+$Jrg`g8xO~2$ssnc9l17hpN}LmGc4y4RFvfCfw-fLNpZ_CY`m z2yWovu|v%>oek7gfoeSTwQpN4Lopons~id9YelU*u0I!dZRU_`$y5%?4g$|A3bDg9Du$8 z17DQw0Xap?Hz%iU;vionF1d+g6N|!P6dmljDH-RX?QNw;2KP zBm0LiJn`;iKOdr%N=K=;ZIXfEI%J=4V4_Pd(*zv=#UzBO6p3*^GpXq)N;BZ_DZM5o zlAmdzcmlK`V(s>dVN>pU1TxbuFoqp9)i|8_)XO$4;$YtDXtBw`lV9LPomKt&EyK|= zH=O#xL2y!0*n;$*_85!>XzN@d z7xUs<@NuXTmzWcj!VA5(#(X@(YUL!+1HDbnn;O)$3_^$Pm`$T9LZ<2tq?Gtg-8*04aub#9ft&iqd@(dD_8IH2t)#Am6@> zMzE0sA|-y`?Ws~lsJ-+RMzUTy`)#;rXe#g)pEVI_mQ#)l(Z=|J?Re*9&;gDp6e~Uo zGFN(k^4M1Ll-}bqx4+Rw@a2`(zhksugev5nlcsKCQK6GrFC~rZe-oEvNJaBt!<8eR*MJ2Cf}Bc&)FGuh-)QSrd8?IX>Bt zXd|?DP^@T-`y)}Gc13Hy(@^tfeM;XdSwL~|D)1Lkq_ipoj1@16cX%a%*lr>M$7DJV zDBe>v^aN;v!4Hq~M}RXyAg?Q%;C#7kz%OKZ*tgdI;O`8?-Z55zoGiKOc7MC=0)rRI z-(y%&WmD_@Br+2H=%+<%2a@}9I|x3!Ce8|Ap`y%1#|$gfPv9rjwV-hCyYWM72Os7U zT4w2K)n|YJEc2gRxCF%~2jK=E%iRrkBnZD z4|55=@D$3Oa=S=id_Tfg6GOA#QEER%t;m^l53F=r}Q*+6A~Opc~f zyp*xCOw555*-cnW&V9m!73wm|_Rp*2-~&4a&-ElWjjuxg(JuJxjv@x4cFPDu0WgEItxyEe@S4#Rz3COjUECPBF!9yR1hRFgI zy(AQR(H3wCJr80I+QWOVU^?Hv&;B-AG)e}w=Wfl-?gOy|&0dRbe?kHcO!9Bv`FSB* zB%CGkb-UCVUc#t~pD?lN?Zxgv&`V#TX7${bx0PeQ{0t}lM%xp6lbHWYzMHL}k-z4< zywyKH7*}@AE#E@k^4?n)m)e#bK%m46QKS0E8}4BS2s8u zkXcZwjr`pEcJE=T;Xg_ZwiPpGsTMRXApOCc=mG@IALCLW-ceHL7(ybff9+~&I)QqL z{m~-#978$8c8LH84B=_KmAFC%3)9yBCE-&l1X?a0<83wu-}3I!;oidHG-PJ+2W#n0Z1F zxrvO5C!fLLcbEr*C@0+P{lQf+c`HeVMX^AS(2^J@3hzYQgt3+~@$E!P;~x?+EO90G z1`38Q&I*tpTw`Te&6QqI2!6XravM1)6TD2R2A6QY)kFMub(pDl#euO91HG*zO9JL? zRM~MfqIAFrRqG=eSB6+mBp7I|89n$5x~7(Yh7aJTX`Rj&er}qaR*a3ql2zqX$4HHD zWL&myWD&UvWga<7d#o(*zz(dSX_-bH5JZPKpRL{>MTA>}`#CTAE*s}{6%HAh*0!S$ zlHE>A#7m@@u0mPBmd?_!fJy^AmU&OPPpxnEb<8YYgP69hD!iU*V)Vvh`3t1HiE1z$ z7Ch@4oY||}NOQ7>_LYc(iA&;~OM(4Xp5=o5mwfLAt~&H=ik3lQb*EtG@cEYS4??v& z|4Y74Oe`b*XZdaog7lAk*G}T;{YSo=|0nrQd{n9d&8V>yuu-S^o1u2j*Mj$HKx(W* z70|u?G^q+}ss@-Fh~3g0AE9u572cnmj6A#a^tkW*T}G$b@41+w|7=TPZe?!X!4xW3 z{>Zcno7ud;lB=;-DwilMhRINix_W4ZxOg;+6kUXJC5f1p!3Jno{ zl+OuWqdM7HI95GEV@xHs0dv4xgCVJTxU$VpMg#0*#XbH)C_7gd7Ua@7ry5y>AUWK zKuwGrYV>3Y(oQJ1%uj+GJSB*PG9<=OhS?AtxdrtK4&dGdx42!nICiEeJEWU7@Nr3HVi)%xwz<7O&vdtpd!?clRr28ji{WZxU%Gq z9~lx7)eNQ9e8j(of>8cX=3O7@Q}D~YuYa3&As^vx{LIkZ{t)wY*6g1SX`GSx zFFeB(4!jaSd9#mZLWk*~bl`6Z*?r+zO+B5L#%gqc?6-)i8E3(PV#$&1ZF@#xXja&^ z`cQI0%UMJXK@tHu1iq;n64_np;)H{ySyw6=(8hm5mZbC(&I-CG#mk#7dly z2#uaYit&nwkYhBl+H#s`aEDm(H9~Mt4%M&>7;$40jxMf!E9f z76Li3QK;MUjJAE`t(&BhaP}V7=f|)|U<->;mX2t;_e^JZSq)@U%Pf)gk6NA_k7GK? zgRVh6kPc`+I_B{^5C^S8`q5tGM~titnMa;Rp>dLJvNvn?54I?6-~gv8P;ETd^MuLoj^vS3Ijls}l4!x=M7o zzZM>WfF;^3z)*w&Q)n1?DRIg~9Tbi5oXhSl9F8uQ1P;wW#gzuNd#!o$-kB_W`mMfqVXwq7?(X z(Hv-Y1QxM|A-y~Nw=olY_gz(+dmfDtuZY}+kKTVN3~+eTtbdFk*sPMmX;(iyo2=Sx za|Rp9_m_%B1FyYD`nO)o+Q}}KtqA~1Ei==I1cm0flUIvvqtrX3N_0-}9oAPd!$hs0Y((e@KNgp6C=`gj%P~JUZD;N_;%U?6#~|cA zI>gv{7%U;F5G1;Q6%fOuhC}3QWt)zwAn-t%K;)fNq#+w7^?S=5PHOUc@?#%%C{y|f z>PNW8&vcHu{IO*!KMoH41^6%T-ia|5&ck=`9$Mx|tNZ2M+3ml)`>!wWt|oVO%P1gY z8RDGYF@h-%X32j5n*?6kh;5m79V8FBopM59y1XcBHs?~u!~JpovhVP`HuHQuuye3; z|4cg5qb!^2g@e$=c83Cw*?&E6&1=~tVhYeE)ByjPY8E*F7vyP(qEP~R_qhou%mYQC z1{5Tju9`__{N}PFCx09>{tFXe%6DcD1}HBqn(L(BPUx&KB{vf)VoyWfpL14!XZGuJ zG!uB)!*$-%r}n5I?xJTP6q6e={F?M-9V2@9K>tyB^;PcmQqnyQm z<#Mn)RD!KIeHeA}RnW3;Z@#JzA`6)fzW1cyW3gj@;0g8}c@4<*H~-3zan!tO)!@6F zCNY8f1h?-1xJ>&BR}k+zV_x?jN98&7RXgOBr!mw|%?w}n-~&sOQVkz;ArmPpyWp#& z`}YFn&h19q7|Ih4GK-q!u;e2KmY6v~>s16_7~ z$6h_LBxT$NHKx7+AN+-JPADl=1q!+c*hPTLD|B!E%V1G%PUb0wxIFGGmN?-tR57*f@66_^Er^Kg&Y3@ATWl2 zYMhac+#Y;(UlPNT!FY}^v#Rhge$N#E-BXgbEK_eBsKbdj(JaquY?#NDaq4nn9gxE3z^2R zhW;+28EQG0k%94;bC;|?;arNVCTkFCNl9%@4eS(7!zd&iVfoANyOt@#Yu$W&2gElr zUy<H0FZ)wq=s$^n$~uU%Z~?3@(LjDfSj&w zg7yZZuv=QjFm*Hw3o$=SUvRSwrI$w6NJDtZYWZ*%L9~tj^nZf)<<v)^7x=VB7(C)VO@ zp|OvWFXgyM9jkMy>)WZM5@}bhMMAst43t=Qm-dU zflvp`BuO3*;#{DQn)gYX!k$=Z^$0rD)Mw|-~Q>l(I z_-mf7h>Ub}NaLWCD^GY>Rt8vQ9bcRa6V_Ay0{7ZMisY^$qG@K!=^x+*QQ&;20?BuM z$9L+F$9f`IIMd==WLoB%0IhN)YF|LI;LCllc#LK&lAo7D+g5R*ArG)^)C)s8Id0CE z(3T4q^k~8eP+w0N008wwoYpAlr5j}YxB+z5U@XYdX}pp{PeIy}!LP3&I+9!f^auG$ z+7HsqOCeUY`|HHCrDc!0ickX55Gh%8zrg$B+6E_?aa(K%$?N63X!%@>j(KVPW3rKH zMc0p0LnFE%%^P7SbTN(Qsd**`&C&Amm%oc)j-^`r4obBRxSC4A%X5M##-R_p*fv@J zOS~%~9H+KQ-VU$+Zh8~wv)Jm((Q68fx#vcYd%oio4pACqiAW^houQ%9AC`F&F=D>k3JXwH!q4iaVXlQJ9{RB6La&l`Q&0MrU;aC zgoO0bi?sw3`_u@}9~RWwD|$jgO6V7ZtTX0C+RRao|c$+ zKv1)pGx`PIL#w=x=bQD!+F~B;+`{bKsP-JD?u`u7OK9wx1+^FJ_$J%N>(_nRdStGW zyt)nz#Ln72933^5I+iIHgghsVNElC|`3p2N_#L`P2Bh(oXy?7{2^F~5iuea;_{D||bA96gBdNq~H8d^-VS!D_E37_`XQ@7STHm9Nk64G$LsUqW}dbrsKL0#z~#8hb^Bp{Kx$ zX=3U4Bw;tvJyl4st)B%90+@G(7*H2Os$ZQY zf(SNOR76IDvoYprQ+%dJ;#x z&)p$znQN^Z&h$%sh{BewpMSdeJOrD@sA^upm)}rk^@A$k^ON>G(p=%09B7TDXRcup zV4QLlB@W=X5M)wQ;i4(znYjEyum$A+sGv3|ToU@&;n(sZc_X#>DMg%y6eo7A=w@m$ zM=yTtH?eh;r|Jl2O$zO$yFQrEcH)(@^?LI$ zH=aPzB%2l$PtC1Ve6oPIBG)#=aIdxGi7xz#rA*D5#0}nhBgQ)JK(`7>{M`30ycBp# z?NS4OlYi{w%ITJV`uuholNagoCwKq=-#6|5^&R}$|FaVIe|IGBduaPxsegU1jRm8e z8Th&|N1dP5!pSY)YXNR5pPZchiUCugVW|*fGO)S**U&Zzd6(q{MKa>;?A+YD!y_}W z8GlD>XNp$~cAZJXjb1kgvrR-MEvWM`U^F$N-64%@iHL)4X#Vq$?mjF@vwhJn7f;Na zL%DYN?n9dhHbCCJX207lQ2s1yG6wCCJQ^=(Ej2Q!PAsQsGlzZ zB|iLa(0Hy)HGE~Gr}aUpd6BaWs+{SP&SS<`1Wl(36pp%**=4&wKz^Jz_z7l!GK{(w zN(ynTu#p^0GF-75v01!9#L^CW8Kc{G!gdZY8LAWyYRa~&4SlK>Pg)CKJo#PsSPjRx z#u|F?J$gio3u#zxzsgK0F(e`F&zOKdStZ#Z^ zL~nMbD_;IJRf5Rh&1SK7be``gKWl>~>3wMNlqYx7&kC7@p(@2thrtukG#P{(EXOOdw$0 z%=vo!5y$C(lSsjjH%y`TD}@d7W|jHx*cTvN@^|cu^ect!V3dp$jwxR^A6KQYNknjK z;3ppUqKO1gJQeDR$CQE&2A;IHBEAD4pcwA;>`s$E2km#8CN6y&8!8{AJ_p5OggYue zg-REY6{A3rSaAZX`OjeYSL!S8EA@pV{+0T=stKlOWE!_&Z+y0D*Z&wFwWj(?eT8x? zd+q_EF!vgg9@graVT^1>7hPIk7RMCtu(dq*Y{C!j^-kRVp(GQL4iya0rk&KP^!ys^ zhH*u(8WCOkbNxNo{l?RVCCkr%DU>p}a$xSpoB{AP*zL0cJNP}=tv`NoG34AFPbkBW zxJ%6!#L%ZTx$rwOGX@9EZc42p3?+bp5ZT3dZ^*jo(@%p?Zm(&+jg`q}Dn%{-FEB!d zKG2ql^aq8HvA7EaX;Q_LWq?o)m{Pc%9vHNhM*W3Y5Pb1?dcA;{V-qBAzl2|TF@aVv zOJv@UZFR@RM#eaB_~8gkAk5@VoIZL_%0FDM8f6e)i`_n~T1^`~b!)Qe8}eYwzs3kk z3u7IQpy51mF-35u+5QGxnKFx>;KJjx;rw7jyAYE~mQA|yE2|F&j#Siy0KuGbbINO(M9)qGAoAX6o_ZQ`9`RmhrPwF;GB7((A6ES%~7f>XHJ*H))OO@^lBF z5IZiSr|&n1YMljKqM5!7%BfB7`~4g@9;ZiEBoIT(O6`F}Ku1lD?7fVG>HynLc<)_t&+0pMW9Jd1X4%Q zGG>kwLmvIap9z-3xTWunI-+UjK6foAOK&*Jc^~)YNE_`v0+fj-EbeqSOj9GLdroB7Tp>pjoj5C#q z45^|v#*I*Vu|cJL*!gZtneVX-o6Te@hu@;m?xMXf(%Z_Ym5_L@N)sp`1(9IEv$cj_ z8jg~^9A4(eK>tRu$$OG>tQbe){t~6kHM?xW?ggCxx=r;d6G>Fm)_`h~vA>xY_z5C# zNUEr*Laks#|NP6d?6Ves7DwLSEX)Zl)nHLb+o46^IA*(#G+ z6R-oBw5Gwtef^pREN=d`l6!grg6j5(r5r5p=tPfZ&gF1;_>xov-RTtetUwj7 z0-I*M2MbE7TC2t}{7sot(EYUH349qz3gd|aIynz%eT#xB)xai|&MjO{ye zT{FxVCHTYC5Fmt1Lw)=3wS~!1_NhZ*7Q#7ig+pHpt<;~W4M`U3ARJ_j?_-MJEJccP zZLbZ(y?xMvLHrY_&z*05`-ongu<{4UCHs@UKGj<8eO{)81L~98^1xRjZ2wFb=3j|0 z9!qY7^w~|C??f2ORn>yCSoJ08bH~hy<)r6VB5c4%*1nzYR9)9)k>=s%SfPbWJvzKM zjY-Ms68KL_Uhdtvq0a#oer{nm{*P>CsLjc2`|GO`}o2wKy*kR5Eu8 ze#lC#S2daRcVzp%Gh;}D&?!z(=@$GJ^u|A$>c@xMW2gMM0KWbiSr08F7eHvZsc_gG zAXVqaAI>VG+wE?is9p2m-fl3&!E*n5z3Y?JI@=hN%U1eOilIk@TJVkG$CW-dn!7ye zBPjO@xqXkfA)sUtJPat=^8zGo1#^!NmvT{~wv4j#db zGj;t76%N4+2e^M%vl9`$TdGO$>0SQ50C@>}GFpqsqNSa+I0y`ynnQQ`JE9J}issGR zjr=NTz)R>M>W&WRt`a`hH`%Qs4<7Q3XwOQ(grT#FI^l?USgT5bt1oz2=r$n;*}@Og1x?lC@sc_IIAsoh5*z^WlpHQRj&Z5*NnY> z_X;z+4um(AW$$5tB6*G*Mr~AJ24l1kyeWJusJ;7zptZK}WuX0WYq_9_E zEAP7{=FKGT3*1+EIeS2SQhfwvV$evWH2ACXyP93w9X-$|{0wYVg_RUIBKl8CY?$jS zC8pVbx=Dz>v9gTydOKA>*_;9BQXYck=4lg?ZZEo3$qRgGdKF~0nKQ;`#DWi)ZqTLT zWlp!-rLzCh<5jL^{!cXZSEEnMvJ zK2hdBo~+Zmwu1WRSV8m>HN$9e%}HX?_ow1}?Hf{^5-{@-JV?#p=V1Vl#HSpcD6$3?qvUP=CShcmY5WF zB;CW@gv=uE+oF)wcQu>$&Wd8sv2W4wH_<;aG3IuZ%hKKs7)!hXCf1MhpYY@G;3sEH8KAHR4b)f zwKm%kL(;FB*a$7B$A-lrJ<4i3bfA-cE`!m_5Xn&@CkQU3zys>7YYRd#!ui-0>ic}| z&CB1vA+R>|n442r^-J_!kEa!a-N>$XhoGk%vs_S|)ivT5Lt<99f6xflzV?t8pyy*Q zk~Z(ZE`NZ(Pea;Fg81J`{rk-GU!R6x>;M2{|3_5(zZA*;z4FjEN#0}oCdo0{DpK(j zbx#Qisb^V67EGJC{G$(N>mE{eB&&upv6^vML(b`6?{;B*TxO%s+KLAAAXu>8g`D#N zyPsdaN%Gu(kmTykt1ptg@_&(JuNTv;jW>qRAl#5-oteaEy~#1wZ<1_t+CE~#J|PHQ zdF!u|+Gw@8+YJ6>^~2Fs$>g9{G}V#avA%O$&9QzmeZ*!Z`D_9(cwi?<)Nv@SP>%fsG z_ykwzO_MGv-nv{w9-qSl&1L2jBNEE*qbCX874kqk869J6g_W zrgu|Bdjch)qIU2n#e}vejj#fj4Wz4LmHPQug@J%Bfy>zH`_a~o%1~RHfcNW^=SC-=kn5_+Mi779+oMX?AHAdN+{(jdvXYXD6!>meGW~EX!YL5Ag@!aG3#kGFT_A)UTh|V#M`UUvTRoku zipPT|8gjmSjZ}C#@HQane6w@A`_lrluxIR!)D@;zZj(u6EB2h}do2y+SaMV^fNwe; zWVnU$<&woOICVhm(W;d8n%GWqQd;pD(%5Y@F#s^5e@&97|07B6{&uO;up6xG#A@;+ z4ah;TZy{zh0uWVrT&N*EOa+;1tg_)JZ=edWXKe@EyOr#;5xFw$w8jtb?Ebx2A3@3o zBHz51N9$|9k|2#ZzWA(gnyK$qd38ICP=+KaK#ojNp^nkyh8LKIb6U;SnfqilOK*_# zL^RwAL3Z)qF>hMo2mu!#-ZIEu5VB}w;Rd+_vB8J--WPy{a42e;Nw^NAx`tE0+&H3l zhn$w@YT-(GY`ATg{_P%=dk3eKjYBE5r?AGonw<-nj0t(GvtmPQaNx?!;Do1#3lD@F z`})pKuAV{fh)>L$-NOTpJOAVp^VY?|q5d1@ZTbi1eRl4A+tTtU=B-=9qpeLVTlY82 zd#PJoURGu*#%|w;&Nc$wrOnb5yGgnO!8;a$EN<>3S)YTTY&VD$XxaEVZxqQ z!l)nmBCx1u{DAM%*^J%&<(QRUprX@9dab<@D^a-3l-PUdiY@B{^2gRK=ZHJl+>C z?tK-S5epq(Lwbiefz|K0z9E5ttHNiAIxp^&m*3c3bNw8j8)_9Tjnn~2BccsmKj%k$ zxkh`VX_dpXiX*mmQf2CVro&nt7^`#PvaDyHw6Tv~+iqC%a_6z*a7j2}fB;5Uz5z^2 z8c2Lh#w1%3FbR$D0k#UP`{Df4Yb4Ca>2 z%71XKp5yx?KKkO+IvF(n(puU^R;p#ug+!^7KDC}ZrzDr^2br|J$b$5?rLPkWQ+;eI{h}T@t`<@cT2h{W0fiJKPau>(|;c15nLX7Xq zZ0zTV8-+D~@dL+au~A8p_6ZyLZG17o(8vr)>)v@rJlAieT`PG_Y4BWUYyPLq8}zY{ zjn%O-Ki{>wmI`rPE!U)FII8h+BQ7h!PFB&V+h;FA3Bm9573eVicXVUKO>3C03GW+p zXPzbM&jHsu-{h+5xv31h=(+>=P&?z}qAQ@icNr~e7#4rw&ht*AVZqYQleK7e=V;*x?#}HOi&HQzFM0*M#~q3g{xei3Xt84JG=JBIU{5;1<*hiL5uoC+*-Qga zko*UBorHa z%rn6NN9_)>KJM}pmFT>TA1#7ulunesn2?yKq{pPFj04|__rji4I zowXxiAd3-N&lGuT-=uZwoT9#0KdpTY%;QHGrxC>*rm^a<>EMy<)y}Ec+0bu>)+%V9 zTp)lIT-O6C7^OcR{-@QQRp67%3~y1Li4%@BG z)y`1^!EXctnl#U`rB%P6=D;^0U;CTO*Jl_{Aw|=AhDCFZIjH-%2zyc%?g%2e; zshEe-G`yKvS()$s_{(VZq!OxEBD2PE1qlXKN!TLk3xOqrL391L9aTO1BystTSB!!T z7~U29Q6qaO_EHC8T8xCEn2m`8M!ND}I{6qQb46tacfN}0%VtX>JXs(YtPbY+@jfAI z75i6y*E8LR->HfXB|)KtduOe_u61w1Z79wsclgb9D_n!NlQlmp2qiiVZt>D{5(oMd zYRuGQP$s_uvo9tKh`wKm8dTPCGlNv$OF~;U>H)5q@l?zFh-P_P>^zcDX;o%AjUY7wLT(xwgB(xhJuAt%BT5-yVnGYM0S z|Gig+Pm%p+uYA$yfH&~S_$APDghy8x%gYmH5niCffE&u9Y<`xikOnw>(YHNyoy6*> zIG07IV`dsYc&?tDk3WvCPZnVrjG$ttT5kJ2Q||QyL%?v#nYzP|XGy52#J5F2^6=fB zXXHR@|2Nj1_lb4)e`4KOzp-uufB>h>euewqkx#4}M-d$Q53IWia<~6C)=gSbsc}Fo zzSDp20q_t+3N+u}y~S=e7lIv&z0Mc!?@%O*t)jEO4iaXJjUJsEA0M=1PZOK20U_hR z_ZrAa!`Mzb7{?rik7W5|HBFb<-W-zZ@B(lF;G!hYdxu`_=#hL(l{jZZc=yZ2K}*3x(k=ApSwr1kS-l{#w#1}d!Shnb>|`i6 z+c;1W0N}n#%3o<-!`?1vL+7H14?U8M0IE_CQ$y$CQn*W8l~vH6KuIfYD>W|N6Hlr| z*c+!zzgWv_Tj8t%RT|m|3Q~unGWj|=NQ(Q@&QC#I-nWzpLslT+%F!G3e$GU;L<}}* zuYc;yHl-H$KPJm~TKlWy2({mv*}=P35!8$$_OYVk<0J=-Qo53xr zo_0D`3*jnKU$TZkONu0As@Ez+Ax!`iVQf2@BS11Es{jiNrNqwgQdVW!@*>2I<3wI8&Ui){eyTaDw533vcpH}z8Z>yVI zR@(FrtNXB>K0w6ckRgY3v+eopeKkk8O+pTYf6$WjLp?mAsvW@v*Jr?hg5%BVg5xan0nPz4`(F^V7gzcF7#1_ zydAvR@LTv5EP7(xOusj?pV^l$$hLy*JVc22GKI!aMp&WkS-G^c_TayAued!qe`m|O zA9l~b2L8yF)&HI?k6ry+wmjL~vGniRa@-*FI$b|Hu81EmtnpCDr-coq1*64!z>A72 zqVfnLDj7*SG;n9{B@?1q?Hg*$Guk3-YLz77XS$Xq#e>E?E1@;h{t>9kmwO2FOVNt2 z+=2=(KbYhO*QqQ2$E489Egp95R*ce#(dO6{w}DXOWIE@UER(5`C%0JnWB1ru_wI=T zaV$G>;WQTo1+q1)8l)X~+Ns-Vd+Ub8Sb2*lDJ{!#BI?*5IZ?;PcL8}Io4 zPIdn{gv~C>n^Y#Xn9C(>W^5>oY(ECF5`ID2xisd8(R-=$uN0cEF53dWO%COeyZ@c)PWhAS9x3}5s$0qKA5^#DKd9~% z1Oc4ZY9+M!T@{Q3InT?MsT=1 zV+63jb<1|?+3ld^>amWyQCjGjGkeU%DE4A$+o8*A&2c*Y0J0LS*#&9bw%8705@_b| zUSJCKy~cpMZ#BDRCE=lgC1o?&_8yQ4kxkd{h|^ZRZedMwKjm4e7xNv*8{F4N!^PUNP?fmb!V)4etY(C;2chm;?mj$EwY=J(@<+*>9%aFgz<@4pwayji^%H@OqESCq$ZVGYR_L@#v|A}WUi8sKfC^v9T4x(*}&^IV0SdzMlk>H;j+u`aQVx)r2x;- zKf>iFufK)M=o-Jn<;)d?D^|Az#%!2n?qR;c&=Zu+`~g)45-ns&4y?N(9;0VzZk0C71k~P zCDdI$7Ziz0yMFRds5|o$>b{W|&0>=Y?LuK}RP?i>idh|Woe`kgbq)AjnjT{>9*!4W z0!MO_COLxB$V@DU@ktHJXIHBtQ-WR#>?O92?YSnn>vVqt(h03$it)|j&1-)7&{u#T zqOT<1R8Y*h9lCE4Sq8&2)5pq`8%xN<7O0;lA!ucjc+4(E|CTNf=V5g={FyG#DxUWV_SlS~8Z9oVo1;5zQbUqrmk zh=1O81XkeOK^K`3mP=hZGTV3Ej`1r(LfyCDf<&aC=)5SO?9=o6VSWQ1d6|BQ9zMlq zEl`9zrm)BUWxFi1mpTID z#hNd53zbsPgx8vs<%-{7QtcmC%qy8Ejohm`9up6R(TmV+PvjB; zjfUday)m$>dE&8q`nxw-+7a#TxyOcHxa=e2o!7G0B`v$BY)08Ov^k+p*xQ%gHlHmy zjn`lx#ua&C^ZA7Ze&Dr3wTh@(OM=}t-H%TH#`2a{RER7s&_rGe#{d)WwJ6@GN{11X zYAMV~*E%ki`v{OP-c7|qd{|uKQ z{wiFaoN!e@%7rP()~KH-cKQ}HLDGbLq@*5gH=dA&;X3O9*^ur!)wEv$S%pAjBJzzS zZI!byO#Vx}RKYLg){W8mJ?9J=+8sj`2`_HjbHcRM1qBRXJOzi}-SXQX-7*TGniJ|z zgTYEZMVIcqkpe#>+#RfqK@ycTP+s6f*K&%9yEaE)pr(81GOp(SlwwJ0$?qPpe+hN} zXSaN9eH@N0@1v8pvpQbuwvfbzNk5$gB{eEI!yqmtWK! zt=k>I&mhd)JLqhxo^?m<@mo6EtTT_wGXGX=0`PVnMG2k_XCUBK7@Xfwx6t3AZgh@T z+=Vn+o!?M*8|3z%Q1?rh-skf@pHTPs6@R{zSA#G1vIjhxS?%*NU1Mj?Yk^lTe=e1%W}4hKvY9@`KPU>RW^^K z+%T!($-ek|;TO>D12EqD1b$D!C09L1uIYt$FSWyBd{6THgl!A0ulXNGKnq0n3kz(` zSwhaz-;hq&FNmDW`GjxOk-)t&5Lz)ZQhG)O>z(<>db_Ot0d0fx7Yt=Q=~HmY z2i=<b7r)bu0NPsR zjvh6bK6yDN7QWtq@87TvjKh+}ZNYOT^YkzF{fDj??6UZtZt-|<{Fad50VbBgom#Yz zsZsGWBGeW`E$hmh{RJ&0_)9V46!v<}Jv+B9r|9wLqJ)T6c<*TPK7n`+H%<f++XlB>zsu+3r+acPQ$rTR90I{8DMDr7YEm(21L-sWEXISVKxf)ifY_)Vn zk&Zb&Z2R1^6O~;3!(X&7-8^1rSLi=9el%7Z@T7f}<JoP}7x5(y-(5M#hls zerK2sYK)mvjGR-%Eb*wuMP3s!4(ov3txtZiTQtr-fNKOa@%I7tt#M05?5Orp*Is0% zb(Uz7)4jtGk9^&OFGD+m&!QE-nH^Dre#p@dO$56{oH?SDJ7u@eBkA?Jnoq#2-SCDR z&q1$^wkgaO0=TBGWyPDtW6p+YaIzQl0R)sro&Kf28M?vrpt3k!;+Ix{)UX@c?x9?M z&-^g>7=wFiHj-@AOT>NCm3APO)vCSxPo>+q!&xyR9dc_j*;C-xM8tWO8A^u;F!ZL1j6h$TixeFUn@_<|KLc}=3xaisNB{U^} z_I3zAm1w`#10Ik06kp-uIMD3b5!0o7K^A7~Cf>r7qVkle3YO-JhAR)7v0vuFSz$JW z_JB~~*~bHIbA2b*UTPtm%OoI=cj!iNfMPA-Gm~?b7Ox$25%EVh!Y;VX14Ay;4bid( zQaS)Y!r)X{iMScp?_}BIUy|iLlPv04(A;iOvSEh!)P-a;em0?m`1D#^S9b%Vg zTkesQxp~_Ce%W}Gk>I?NzZJ`OmpuPgEJOaISnh)RT`d3beKfWD_hOmzFN@`Y|6{Ri z_gO5n|3|T$!L5$PW6Qys)dspd@UKXBTleznb+yTFq&p&t^zM9I!<}2j+W*7T#9{$e zjb>6xHm8I!jYk%LEcgRR`_gJJ98I}GxY)>@!v)*>4*px=-5*GIzz1wE@Qob>Co;l_6H1x`Y`jws3-x)hb zOuWc@bw)O=rt~^&>Barw=~w)#gvQoreDB?w8@!B+Ozz&S@d!Nk)%NrAbI1=KFaLzO zM{?|(rs?Ueff8Bpkt`SRk!v`2E;VSD3`#S0QCn~KM@y`p>>iteF1%<_zvpiu(0UR; zX)~uP_1gt|sx8U-g22oR@){xt3|oEz)R!_*RNcoSSI*Aw z!3L)bGH6=bu)5qZI2cB}0lS?EPLHtaJoMwUfD{lf$y)*|3>@j(Km4U{(A(}Jd%gTM zro$zn1iDbgAsPim@P}TV@U}Vg4<-L+i>eK}^B50Sv8{Km)~{08zR&@V+^Opi)-ceK zF*K3whLOo3YnK=z@Ov{|8=`lsiI;Zy{1Vvg%=-9^qA2>=foOdR;FezYhnzacBqLKR zGkU12w`BB($isz$j2<)-qwxk-9Etied{m{*%b1_Hs&Sr7hoj?KQPFA9dyBUn7J`%X zFmCNS6NmKI_+ULpECxati3op1goHFAZl_BlzO3$PHSRE`K#l4z2hH6zG|YYKDl*gC zeU~I7SZ;~A(Qr?wePU4r@cOc{tnzFGyT-zF+QakOc9;I#q5T3>BB8obJ@4%?-204E1M?>GB1#TvexA^BM6{=!ly(-kW)KiYoY zX2Y9;PLmHkD{LwYMSmp@#z%*86mJw5;<6;7`%aHvw(b_wiNyoWEnC!RrEQ~~!QoFK zttC`GpslW3GlI;8dS{wsl+dfi~E?6@_>2QE%tb_eSbZtUY$&;c77jooi&cG zP)%f!nXMW_1>k`_Q>LsIl_JpY^t(m2Uktr0S7aT+oyXUa!}dV(8!l8B&1}P{UEKU( z8z7EQi;2V&DTVDR@3l7MGAhI}+d5@%0>ety-696bZ$%7DuWix=sHHP$h->^SVti((s2Y>mReaY`wl z^xLV1rcUQCU6oqV!aQAxVV_)22Aa7`sbZtH1EertHjJ;H#j@- z9fORl|B(##^lp8Xl}%$WXs@U{*G8%|*0ruvgl9wl;_U&pet^xOTXyTaWymyiakZU- zmGAX5d`Zv4J(d1$O?MH~rxK6bLZC;{E*{-n9&wJ)qocI=VR!uI&IK6WOjfF}4AES* zzc+%E|7rAv%ciEtOQ~u~-IT_nD@r|q(cb_l662G&A-gijD@%$Ur$>lSa-j++C`}3v z3aWv6O37ojvq57}LzF4Z8tC76e%%PlPY{Kt;jgg>Ps?T>!Agt)4vRy53J=q3z#Ot1 zVnOCz(MQ;B66g7R^r6M*jP5>*eMsU82WRNVj1)TIICD4px~b1@XT$!4w9$`6d3O~> zgREc5KG$Ol6!MTXwE7ZU;xYA7uLZR8Rg;0K>F_&yQ?+W}D|oRC&-QlZEFn4OK1W~| zG_ic=`;bH7gijsm!7Zwdp}Fm?c@ga(tP5Hii@MXCG_9+bP%D%S+I}DE%qL(;R4%|& zDjA<)VRG3u!7^9_i3)59zn7#LL}SL(5L5mVg3*dUNmr=#4z>I(i@mWq+s|`i(>}_? z&2zCIm(-}(=H#O;=Um)pdC|s(9*FC#jbSxgnODAA+fw{vy7+7+=v@05$os3c8GRe^Tv)V_4fn3{$K3!r7hyh-q%u9MN9uzl zf7IHkK6Sn+yQxK%L!?hwxuHJ4S?P-ka40iC*Asyx_L8IR0o+acUF5IrCOd{D4-ReD zU3y8THF) z15+k{k>4$jQAelfl6gT)oFF)wlv{Bc%kZ1k%mg9wD#0g}H&SJVXg!G|>D0mtI_<(35IH){y z3N!2SN;#;Uc>~f3-%C*EBS36+(oNF4Z*T-vgGOF?rKN6x@zU{US}&p)T8WV#rd1`v zSR6clt&Z9^mUEz40I9kZo`1CuoD(@TN6qP4ARf=?B!?LmR>|W~RMao}Nv@t;J$}Q( zo?&Djui{M;U5$WIf!s_sP7715b`XJN;t{oBEf0%0a}MYpn|k8Gl$VcGI40V}m1qIV zJ0QODsCZsNrCe5#∨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 literal 0 HcmV?d00001 From fc54e205b925f3dedaddea9b9517c3b53f8d86bc Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Thu, 9 May 2024 06:49:16 +0200 Subject: [PATCH 04/10] Move methods --- .../classes/java/io/FileInputStream.java | 94 +++---- .../classes/java/io/FileOutputStream.java | 76 +++--- .../classes/java/io/RandomAccessFile.java | 170 ++++++------ .../classes/sun/nio/ch/FileChannelImpl.java | 247 +++++++++--------- 4 files changed, 293 insertions(+), 294 deletions(-) diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index db6ce897ea187..389e6b67270d1 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -234,6 +234,31 @@ public int read() throws IOException { private native int read0() throws IOException; + private int traceRead0() throws IOException { + if (!FileReadEvent.enabled()) { + return read0(); + } + int result = 0; + boolean endOfFile = false; + long bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + result = read0(); + if (result < 0) { + endOfFile = true; + } else { + bytesRead = 1; + } + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); + } + } + return result; + } + /** * Reads a subarray as a sequence of bytes. * @param b the data to be written @@ -243,6 +268,28 @@ public int read() throws IOException { */ private native int readBytes(byte[] b, int off, int len) throws IOException; + private int traceReadBytes(byte b[], int off, int len) throws IOException { + if (!FileReadEvent.enabled()) { + return readBytes(b, off, len); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readBytes(b, off, len); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + /** * Reads up to {@code b.length} bytes of data from this input * stream into an array of bytes. This method blocks until some input @@ -560,51 +607,4 @@ public FileChannel getChannel() { static { initIDs(); } - - private int traceRead0() throws IOException { - if (!FileReadEvent.enabled()) { - return read0(); - } - int result = 0; - boolean endOfFile = false; - long bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - result = read0(); - if (result < 0) { - endOfFile = true; - } else { - bytesRead = 1; - } - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); - } - } - return result; - } - - private int traceReadBytes(byte b[], int off, int len) throws IOException { - if (!FileReadEvent.enabled()) { - return readBytes(b, off, len); - } - int bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - bytesRead = readBytes(b, off, len); - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } } diff --git a/src/java.base/share/classes/java/io/FileOutputStream.java b/src/java.base/share/classes/java/io/FileOutputStream.java index 96d1000ad3bc3..35f0938d361c0 100644 --- a/src/java.base/share/classes/java/io/FileOutputStream.java +++ b/src/java.base/share/classes/java/io/FileOutputStream.java @@ -301,6 +301,25 @@ private void open(String name, boolean append) throws FileNotFoundException { */ private native void write(int b, boolean append) throws IOException; + private void traceWrite(int b, boolean append) throws IOException { + if (!FileWriteEvent.enabled()) { + write(b, append); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + write(b, append); + bytesWritten = 1; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + /** * Writes the specified byte to this file output stream. Implements * the {@code write} method of {@code OutputStream}. @@ -330,6 +349,25 @@ public void write(int b) throws IOException { private native void writeBytes(byte[] b, int off, int len, boolean append) throws IOException; + private void traceWriteBytes(byte b[], int off, int len, boolean append) throws IOException { + if (!FileWriteEvent.enabled()) { + writeBytes(b, off, len, append); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + writeBytes(b, off, len, append); + bytesWritten = len; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + /** * Writes {@code b.length} bytes from the specified byte array * to this file output stream. @@ -477,42 +515,4 @@ public FileChannel getChannel() { static { initIDs(); } - - private void traceWrite(int b, boolean append) throws IOException { - if (!FileWriteEvent.enabled()) { - write(b, append); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - write(b, append); - bytesWritten = 1; - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - private void traceWriteBytes(byte b[], int off, int len, boolean append) throws IOException { - if (!FileWriteEvent.enabled()) { - writeBytes(b, off, len, append); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - writeBytes(b, off, len, append); - bytesWritten = len; - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } } diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index 0488e5c464d12..bb43b6dc2f613 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -389,6 +389,31 @@ public int read() throws IOException { private native int read0() throws IOException; + private int traceRead0() throws IOException { + if (!FileReadEvent.enabled()) { + return read0(); + } + int result = 0; + long bytesRead = 0; + boolean endOfFile = false; + long start = 0; + try { + start = FileReadEvent.timestamp(); + result = read0(); + if (result < 0) { + endOfFile = true; + } else { + bytesRead = 1; + } + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); + } + } + return result; + } + /** * Reads a sub array as a sequence of bytes. * @param b the buffer into which the data is read. @@ -405,6 +430,28 @@ private int readBytes(byte[] b, int off, int len) throws IOException { private native int readBytes0(byte[] b, int off, int len) throws IOException; + private int traceReadBytes0(byte b[], int off, int len) throws IOException { + if (!FileReadEvent.enabled()) { + return readBytes0(b, off, len); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = readBytes0(b, off, len); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + /** * Reads up to {@code len} bytes of data from this file into an * array of bytes. This method blocks until at least one byte of input @@ -564,6 +611,25 @@ private void implWrite(int b) throws IOException { } } + private void traceImplWrite(int b) throws IOException { + if (!FileWriteEvent.enabled()) { + implWrite(b); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + implWrite(b); + bytesWritten = 1; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + private native void write0(int b) throws IOException; /** @@ -591,6 +657,25 @@ private void implWriteBytes(byte[] b, int off, int len) throws IOException { } } + private void traceImplWriteBytes(byte b[], int off, int len) throws IOException { + if (!FileWriteEvent.enabled()) { + implWriteBytes(b, off, len); + return; + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + implWriteBytes(b, off, len); + bytesWritten = len; + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + FileWriteEvent.commit(start, duration, path, bytesWritten); + } + } + } + private native void writeBytes0(byte[] b, int off, int len) throws IOException; /** @@ -1225,91 +1310,6 @@ public final void writeUTF(String str) throws IOException { DataOutputStream.writeUTF(str, this); } - private int traceRead0() throws IOException { - if (!FileReadEvent.enabled()) { - return read0(); - } - int result = 0; - long bytesRead = 0; - boolean endOfFile = false; - long start = 0; - try { - start = FileReadEvent.timestamp(); - result = read0(); - if (result < 0) { - endOfFile = true; - } else { - bytesRead = 1; - } - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - FileReadEvent.commit(start, duration, path, bytesRead, endOfFile); - } - } - return result; - } - - private int traceReadBytes0(byte b[], int off, int len) throws IOException { - if (!FileReadEvent.enabled()) { - return readBytes0(b, off, len); - } - int bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - bytesRead = readBytes0(b, off, len); - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - private void traceImplWrite(int b) throws IOException { - if (!FileWriteEvent.enabled()) { - implWrite(b); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - implWrite(b); - bytesWritten = 1; - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - - private void traceImplWriteBytes(byte b[], int off, int len) throws IOException { - if (!FileWriteEvent.enabled()) { - implWriteBytes(b, off, len); - return; - } - long bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - ImplWriteBytes(b, off, len); - bytesWritten = len; - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - FileWriteEvent.commit(start, duration, path, bytesWritten); - } - } - } - private static native void initIDs(); static { diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index 11e5734b0039d..8689910bf3a7a 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -261,6 +261,28 @@ private int implRead(ByteBuffer dst) throws IOException { } } + private int traceImplRead(ByteBuffer dst) throws IOException { + if (!FileReadEvent.enabled()) { + return implRead(dst); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = implRead(dst); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + @Override public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { if (jfrTracing) { @@ -304,6 +326,28 @@ private long implRead(ByteBuffer[] dsts, int offset, int length) } } + private long traceImplRead(ByteBuffer[] dsts, int offset, int length) throws IOException { + if (!FileReadEvent.enabled()) { + return implRead(dsts, offset, length); + } + long bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = implRead(dsts, offset, length); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + @Override public int write(ByteBuffer src) throws IOException { if (jfrTracing) { @@ -344,6 +388,25 @@ private int implWrite(ByteBuffer src) throws IOException { } } + private int traceImplWrite(ByteBuffer src) throws IOException { + if (!FileWriteEvent.enabled()) { + return implWrite(src); + } + int bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = implWrite(src); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } + @Override public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { if (jfrTracing) { @@ -385,6 +448,24 @@ private long implWrite(ByteBuffer[] srcs, int offset, int length) throws IOExcep } } + private long traceImplWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { + if (!FileWriteEvent.enabled()) { + return implWrite(srcs, offset, length); + } + long bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = implWrite(srcs, offset, length); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } // -- Other operations -- @Override @@ -1084,6 +1165,28 @@ private int implRead(ByteBuffer dst, long position) throws IOException { } } + private int traceImplRead(ByteBuffer dst, long position) throws IOException { + if (!FileReadEvent.enabled()) { + return implRead(dst, position); + } + int bytesRead = 0; + long start = 0; + try { + start = FileReadEvent.timestamp(); + bytesRead = implRead(dst, position); + } finally { + long duration = FileReadEvent.timestamp() - start; + if (FileReadEvent.shouldCommit(duration)) { + if (bytesRead < 0) { + FileReadEvent.commit(start, duration, path, 0L, true); + } else { + FileReadEvent.commit(start, duration, path, bytesRead, false); + } + } + } + return bytesRead; + } + private int readInternal(ByteBuffer dst, long position) throws IOException { assert !nd.needsPositionLock() || Thread.holdsLock(positionLock); int n = 0; @@ -1137,6 +1240,26 @@ private int implWrite(ByteBuffer src, long position) throws IOException { } } + private int traceImplWrite(ByteBuffer src, long position) throws IOException { + if (!FileWriteEvent.enabled()) { + return implWrite(src, position); + } + + int bytesWritten = 0; + long start = 0; + try { + start = FileWriteEvent.timestamp(); + bytesWritten = implWrite(src, position); + } finally { + long duration = FileWriteEvent.timestamp() - start; + if (FileWriteEvent.shouldCommit(duration)) { + long bytes = bytesWritten > 0 ? bytesWritten : 0; + FileWriteEvent.commit(start, duration, path, bytes); + } + } + return bytesWritten; + } + private int writeInternal(ByteBuffer src, long position) throws IOException { assert !nd.needsPositionLock() || Thread.holdsLock(positionLock); int n = 0; @@ -1662,128 +1785,4 @@ void release(FileLockImpl fli) throws IOException { assert fileLockTable != null; fileLockTable.remove(fli); } - - private int traceImplRead(ByteBuffer dst) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dst); - } - int bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - bytesRead = implRead(dst); - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - private int traceImplRead(ByteBuffer dst, long position) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dst, position); - } - int bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - bytesRead = implRead(dst, position); - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - private long traceImplRead(ByteBuffer[] dsts, int offset, int length) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dsts, offset, length); - } - long bytesRead = 0; - long start = 0; - try { - start = FileReadEvent.timestamp(); - bytesRead = implRead(dsts, offset, length); - } finally { - long duration = FileReadEvent.timestamp() - start; - if (FileReadEvent.shouldCommit(duration)) { - if (bytesRead < 0) { - FileReadEvent.commit(start, duration, path, 0L, true); - } else { - FileReadEvent.commit(start, duration, path, bytesRead, false); - } - } - } - return bytesRead; - } - - private int traceImplWrite(ByteBuffer src) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(src); - } - int bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - bytesWritten = implWrite(src); - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } - - private int traceImplWrite(ByteBuffer src, long position) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(src, position); - } - - int bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - bytesWritten = implWrite(src, position); - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } - - private long traceImplWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(srcs, offset, length); - } - long bytesWritten = 0; - long start = 0; - try { - start = FileWriteEvent.timestamp(); - bytesWritten = implWrite(srcs, offset, length); - } finally { - long duration = FileWriteEvent.timestamp() - start; - if (FileWriteEvent.shouldCommit(duration)) { - long bytes = bytesWritten > 0 ? bytesWritten : 0; - FileWriteEvent.commit(start, duration, path, bytes); - } - } - return bytesWritten; - } } From eec976d78eca491c44829a17ac7119299f4fe655 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Mon, 13 May 2024 01:57:22 +0200 Subject: [PATCH 05/10] Revert accidental push of removal JI* classes. Will be handled seperately --- .../classes/jdk/jfr/internal/JVMUpcalls.java | 3 +- .../jdk/jfr/internal/PlatformRecorder.java | 4 +- .../internal/{ => instrument}/JDKEvents.java | 58 ++++++- .../instrument/JIClassInstrumentation.java | 130 +++++++++++++++ .../jfr/internal/instrument/JIInliner.java | 113 +++++++++++++ .../instrument/JIInstrumentationMethod.java | 36 +++++ .../instrument/JIInstrumentationTarget.java | 37 +++++ .../instrument/JIMethodCallInliner.java | 152 ++++++++++++++++++ .../instrument/JIMethodInliningAdapter.java | 76 +++++++++ .../instrument/JIMethodMergeAdapter.java | 122 ++++++++++++++ .../internal/instrument/JITypeMapping.java | 35 ++++ .../management/ManagementSupport.java | 4 +- 12 files changed, 760 insertions(+), 10 deletions(-) rename src/jdk.jfr/share/classes/jdk/jfr/internal/{ => instrument}/JDKEvents.java (83%) create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java index 2eed7b918fd21..9c37a1ab660c9 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMUpcalls.java @@ -27,6 +27,7 @@ import java.lang.reflect.Modifier; import jdk.jfr.internal.event.EventConfiguration; +import jdk.jfr.internal.instrument.JDKEvents; import jdk.jfr.internal.util.Bytecode; /** * All upcalls from the JVM should go through this class. @@ -77,7 +78,7 @@ static byte[] onRetransform(long traceId, boolean dummy1, boolean dummy2, Class< Bytecode.log(clazz.getName(), bytes); return bytes; } - return oldBytes; + return JDKEvents.retransformCallback(clazz, oldBytes); } catch (Throwable t) { Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Unexpected error when adding instrumentation to event class " + clazz.getName()); } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java index 24b98bb629f04..1cd7297928630 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,6 +57,7 @@ import jdk.jfr.internal.SecuritySupport.SafePath; import jdk.jfr.internal.SecuritySupport.SecureRecorderListener; import jdk.jfr.internal.consumer.EventLog; +import jdk.jfr.internal.instrument.JDKEvents; import jdk.jfr.internal.periodic.PeriodicEvents; import jdk.jfr.internal.util.Utils; @@ -82,6 +83,7 @@ public PlatformRecorder() throws Exception { Logger.log(JFR_SYSTEM, INFO, "Created native"); JDKEvents.initialize(); Logger.log(JFR_SYSTEM, INFO, "Registered JDK events"); + JDKEvents.addInstrumentation(); startDiskMonitor(); shutdownHook = SecuritySupport.createThreadWitNoPermissions("JFR Shutdown Hook", new ShutdownHook(this)); SecuritySupport.setUncaughtExceptionHandler(shutdownHook, new ShutdownHook.ExceptionHandler()); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java similarity index 83% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java index ee9b5f2b4cd31..09f811b6a0f2a 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java @@ -23,26 +23,35 @@ * questions. */ -package jdk.jfr.internal; +package jdk.jfr.internal.instrument; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; import jdk.internal.access.SharedSecrets; import jdk.internal.event.JFRTracing; import jdk.internal.event.ThrowableTracer; -import jdk.internal.platform.Container; -import jdk.internal.platform.Metrics; import jdk.jfr.Event; import jdk.jfr.events.ActiveRecordingEvent; import jdk.jfr.events.ActiveSettingEvent; -import jdk.jfr.events.ContainerCPUThrottlingEvent; -import jdk.jfr.events.ContainerCPUUsageEvent; -import jdk.jfr.events.ContainerConfigurationEvent; import jdk.jfr.events.ContainerIOUsageEvent; +import jdk.jfr.events.ContainerConfigurationEvent; +import jdk.jfr.events.ContainerCPUUsageEvent; +import jdk.jfr.events.ContainerCPUThrottlingEvent; import jdk.jfr.events.ContainerMemoryUsageEvent; import jdk.jfr.events.DirectBufferStatisticsEvent; +import jdk.jfr.events.FileForceEvent; import jdk.jfr.events.InitialSecurityPropertyEvent; + +import jdk.jfr.internal.JVM; +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; +import jdk.jfr.internal.SecuritySupport; import jdk.jfr.internal.periodic.PeriodicEvents; +import jdk.internal.platform.Container; +import jdk.internal.platform.Metrics; public final class JDKEvents { @@ -76,6 +85,11 @@ public final class JDKEvents { InitialSecurityPropertyEvent.class, }; + // This is a list of the classes with instrumentation code that should be applied. + private static final Class[] instrumentationClasses = new Class[] { + }; + + private static final Class[] targetClasses = new Class[instrumentationClasses.length]; private static final Runnable emitExceptionStatistics = JDKEvents::emitExceptionStatistics; private static final Runnable emitDirectBufferStatistics = JDKEvents::emitDirectBufferStatistics; private static final Runnable emitContainerConfiguration = JDKEvents::emitContainerConfiguration; @@ -107,6 +121,24 @@ public static synchronized void initialize() { } } + public static void addInstrumentation() { + try { + List> list = new ArrayList<>(); + for (int i = 0; i < instrumentationClasses.length; i++) { + JIInstrumentationTarget tgt = instrumentationClasses[i].getAnnotation(JIInstrumentationTarget.class); + Class clazz = Class.forName(tgt.value()); + targetClasses[i] = clazz; + list.add(clazz); + } + Logger.log(LogTag.JFR_SYSTEM, LogLevel.INFO, "Retransformed JDK classes"); + JVM.retransformClasses(list.toArray(new Class[list.size()])); + } catch (IllegalStateException ise) { + throw ise; + } catch (Exception e) { + Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Could not add instrumentation for JDK events. " + e.getMessage()); + } + } + private static void initializeContainerEvents() { if (JVM.isContainerized() ) { Logger.log(LogTag.JFR_SYSTEM, LogLevel.DEBUG, "JVM is containerized"); @@ -193,6 +225,20 @@ private static void emitContainerCPUThrottling() { } } + @SuppressWarnings("deprecation") + public static byte[] retransformCallback(Class klass, byte[] oldBytes) throws Throwable { + for (int i = 0; i < targetClasses.length; i++) { + if (targetClasses[i].equals(klass)) { + Class c = instrumentationClasses[i]; + if (Logger.shouldLog(LogTag.JFR_SYSTEM, LogLevel.TRACE)) { + Logger.log(LogTag.JFR_SYSTEM, LogLevel.TRACE, "Processing instrumentation class: " + c); + } + return new JIClassInstrumentation(instrumentationClasses[i], klass, oldBytes).getNewBytes(); + } + } + return oldBytes; + } + public static void remove() { PeriodicEvents.removeEvent(emitExceptionStatistics); PeriodicEvents.removeEvent(emitDirectBufferStatistics); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java new file mode 100644 index 0000000000000..7c5b179248ac5 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIClassInstrumentation.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.org.objectweb.asm.tree.ClassNode; +import jdk.jfr.internal.SecuritySupport; + +/** + * This class will perform byte code instrumentation given an "instrumentor" class. + * + * @see JITracer + * + * @author Staffan Larsen + */ +@Deprecated +final class JIClassInstrumentation { + private final Class instrumentor; + private final String targetName; + private final String instrumentorName; + private final byte[] newBytes; + private final ClassReader targetClassReader; + private final ClassReader instrClassReader; + + /** + * Creates an instance and performs the instrumentation. + * + * @param instrumentor instrumentor class + * @param target target class + * @param old_target_bytes bytes in target + * + * @throws ClassNotFoundException + * @throws IOException + */ + JIClassInstrumentation(Class instrumentor, Class target, byte[] old_target_bytes) throws ClassNotFoundException, IOException { + instrumentorName = instrumentor.getName(); + this.targetName = target.getName(); + this.instrumentor = instrumentor; + this.targetClassReader = new ClassReader(old_target_bytes); + this.instrClassReader = new ClassReader(getOriginalClassBytes(instrumentor)); + this.newBytes = makeBytecode(); + } + + private static byte[] getOriginalClassBytes(Class clazz) throws IOException { + String name = "/" + clazz.getName().replace(".", "/") + ".class"; + try (InputStream is = SecuritySupport.getResourceAsStream(name)) { + return is.readAllBytes(); + } + } + + private byte[] makeBytecode() throws IOException, ClassNotFoundException { + + // Find the methods to instrument and inline + + final List instrumentationMethods = new ArrayList<>(); + for (final Method m : instrumentor.getDeclaredMethods()) { + JIInstrumentationMethod im = m.getAnnotation(JIInstrumentationMethod.class); + if (im != null) { + instrumentationMethods.add(m); + } + } + + // We begin by inlining the target's methods into the instrumentor + + ClassNode temporary = new ClassNode(); + ClassVisitor inliner = new JIInliner( + Opcodes.ASM7, + temporary, + targetName, + instrumentorName, + targetClassReader, + instrumentationMethods); + instrClassReader.accept(inliner, ClassReader.EXPAND_FRAMES); + + // Now we have the target's methods inlined into the instrumentation code (in 'temporary'). + // We now need to replace the target's method with the code in the + // instrumentation method. + + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + JIMethodMergeAdapter ma = new JIMethodMergeAdapter( + cw, + temporary, + instrumentationMethods, + instrumentor.getAnnotationsByType(JITypeMapping.class)); + targetClassReader.accept(ma, ClassReader.EXPAND_FRAMES); + + return cw.toByteArray(); + } + + /** + * Get the instrumented byte codes that can be used to retransform the class. + * + * @return bytes + */ + public byte[] getNewBytes() { + return newBytes.clone(); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java new file mode 100644 index 0000000000000..4bd182ec40342 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInliner.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.List; + +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.MethodVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.org.objectweb.asm.Type; +import jdk.internal.org.objectweb.asm.tree.ClassNode; +import jdk.internal.org.objectweb.asm.tree.MethodNode; +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; + +@Deprecated +final class JIInliner extends ClassVisitor { + private final String targetClassName; + private final String instrumentationClassName; + private final ClassNode targetClassNode; + private final List instrumentationMethods; + + /** + * A ClassVisitor which will check all methods of the class it visits against the instrumentationMethods + * list. If a method is on that list, the method will be further processed for inlining into that + * method. + */ + JIInliner(int api, ClassVisitor cv, String targetClassName, String instrumentationClassName, + ClassReader targetClassReader, + List instrumentationMethods) { + super(api, cv); + this.targetClassName = targetClassName; + this.instrumentationClassName = instrumentationClassName; + this.instrumentationMethods = instrumentationMethods; + + ClassNode cn = new ClassNode(Opcodes.ASM7); + targetClassReader.accept(cn, ClassReader.EXPAND_FRAMES); + this.targetClassNode = cn; + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + + if (isInstrumentationMethod(name, desc)) { + MethodNode methodToInline = findTargetMethodNode(name, desc); + if (methodToInline == null) { + throw new IllegalArgumentException("Could not find the method to instrument in the target class"); + } + if (Modifier.isNative(methodToInline.access)) { + throw new IllegalArgumentException("Cannot instrument native methods: " + targetClassNode.name + "." + methodToInline.name + methodToInline.desc); + } + + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Inliner processing method " + name + desc); + + JIMethodCallInliner mci = new JIMethodCallInliner(access, + desc, + mv, + methodToInline, + targetClassName, + instrumentationClassName); + return mci; + } + + return mv; + } + + private boolean isInstrumentationMethod(String name, String desc) { + for(Method m : instrumentationMethods) { + if (m.getName().equals(name) && Type.getMethodDescriptor(m).equals(desc)) { + return true; + } + } + return false; + } + + private MethodNode findTargetMethodNode(String name, String desc) { + for (MethodNode mn : targetClassNode.methods) { + if (mn.desc.equals(desc) && mn.name.equals(name)) { + return mn; + } + } + throw new IllegalArgumentException("could not find MethodNode for " + + name + desc); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java new file mode 100644 index 0000000000000..bebaad4c81592 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationMethod.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@interface JIInstrumentationMethod { +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java new file mode 100644 index 0000000000000..d48a4e3ac5f38 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIInstrumentationTarget.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@interface JIInstrumentationTarget { + String value(); +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java new file mode 100644 index 0000000000000..c73e7d4dbdde0 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodCallInliner.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.util.ArrayList; +import java.util.List; + +import jdk.internal.org.objectweb.asm.Label; +import jdk.internal.org.objectweb.asm.MethodVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.org.objectweb.asm.commons.LocalVariablesSorter; +import jdk.internal.org.objectweb.asm.commons.Remapper; +import jdk.internal.org.objectweb.asm.commons.SimpleRemapper; +import jdk.internal.org.objectweb.asm.tree.MethodNode; +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; + +/** + * Class responsible for finding the call to inline and inlining it. + * + * This code is heavily influenced by section 3.2.6 "Inline Method" in + * "Using ASM framework to implement common bytecode transformation patterns", + * E. Kuleshov, AOSD.07, March 2007, Vancouver, Canada. + * http://asm.ow2.org/index.html + */ +@Deprecated +final class JIMethodCallInliner extends LocalVariablesSorter { + + private final String oldClass; + private final String newClass; + private final MethodNode inlineTarget; + private final List blocks = new ArrayList<>(); + private boolean inlining; + + /** + * inlineTarget defines the method to inline and also contains the actual + * code to inline. + * + * @param access + * @param desc + * @param mv + * @param inlineTarget + * @param oldClass + * @param newClass + * @param logger + */ + public JIMethodCallInliner(int access, String desc, MethodVisitor mv, + MethodNode inlineTarget, String oldClass, String newClass) { + super(Opcodes.ASM7, access, desc, mv); + this.oldClass = oldClass; + this.newClass = newClass; + this.inlineTarget = inlineTarget; + + if (Logger.shouldLog(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG)) { + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, + "MethodCallInliner: targetMethod=" + newClass + "." + + inlineTarget.name + inlineTarget.desc); + } + } + + @Override + public void visitMethodInsn(int opcode, String owner, String name, + String desc, boolean itf) { + // Now we are looking at method call in the source method + if (!shouldBeInlined(owner, name, desc)) { + // If this method call should not be inlined, just keep it + mv.visitMethodInsn(opcode, owner, name, desc, itf); + return; + } + // If the call should be inlined, we create a MethodInliningAdapter + // The MIA will walk the instructions in the inlineTarget and add them + // to the current method, doing the necessary name remappings. + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Inlining call to " + name + desc); + Remapper remapper = new SimpleRemapper(oldClass, newClass); + Label end = new Label(); + inlining = true; + inlineTarget.instructions.resetLabels(); + JIMethodInliningAdapter mia = new JIMethodInliningAdapter(this, end, + opcode == Opcodes.INVOKESTATIC ? Opcodes.ACC_STATIC : 0, desc, + remapper); + inlineTarget.accept(mia); + inlining = false; + super.visitLabel(end); + } + + /** + * Determine if the method should be inlined or not. + */ + private boolean shouldBeInlined(String owner, String name, String desc) { + return inlineTarget.desc.equals(desc) && inlineTarget.name.equals(name) + && owner.equals(newClass.replace('.', '/')); + } + + @Override + public void visitTryCatchBlock(Label start, Label end, Label handler, + String type) { + if (!inlining) { + // try-catch blocks are saved here and replayed at the end + // of the method (in visitMaxs) + blocks.add(new CatchBlock(start, end, handler, type)); + } else { + super.visitTryCatchBlock(start, end, handler, type); + } + } + + @Override + public void visitMaxs(int stack, int locals) { + for (CatchBlock b : blocks) { + super.visitTryCatchBlock(b.start, b.end, b.handler, b.type); + } + super.visitMaxs(stack, locals); + } + + static final class CatchBlock { + + final Label start; + final Label end; + final Label handler; + final String type; + + CatchBlock(Label start, Label end, Label handler, String type) { + this.start = start; + this.end = end; + this.handler = handler; + this.type = type; + } + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java new file mode 100644 index 0000000000000..2f5458c4d9012 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodInliningAdapter.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import jdk.internal.org.objectweb.asm.Label; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.org.objectweb.asm.Type; +import jdk.internal.org.objectweb.asm.commons.LocalVariablesSorter; +import jdk.internal.org.objectweb.asm.commons.Remapper; +import jdk.internal.org.objectweb.asm.commons.RemappingMethodAdapter; + +@Deprecated +final class JIMethodInliningAdapter extends RemappingMethodAdapter { + private final LocalVariablesSorter lvs; + private final Label end; + + public JIMethodInliningAdapter(LocalVariablesSorter mv, Label end, int acc, String desc, Remapper remapper) { + super(acc, desc, mv, remapper); + this.lvs = mv; + this.end = end; + int offset = isStatic(acc) ? 0 : 1; + Type[] args = Type.getArgumentTypes(desc); + for (int i = args.length - 1; i >= 0; i--) { + super.visitVarInsn(args[i].getOpcode(Opcodes.ISTORE), i + offset); + } + if (offset > 0) { + super.visitVarInsn(Opcodes.ASTORE, 0); + } + } + + private boolean isStatic(int acc) { + return (acc & Opcodes.ACC_STATIC) != 0; + } + + @Override + public void visitInsn(int opcode) { + if (opcode == Opcodes.RETURN || opcode == Opcodes.IRETURN + || opcode == Opcodes.ARETURN || opcode == Opcodes.LRETURN) { + super.visitJumpInsn(Opcodes.GOTO, end); + } else { + super.visitInsn(opcode); + } + } + + @Override + public void visitMaxs(int stack, int locals) { + } + + @Override + protected int newLocalMapping(Type type) { + return lvs.newLocal(type); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java new file mode 100644 index 0000000000000..9d17b17a8ad55 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JIMethodMergeAdapter.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.MethodVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.org.objectweb.asm.Type; +import jdk.internal.org.objectweb.asm.commons.RemappingMethodAdapter; +import jdk.internal.org.objectweb.asm.commons.SimpleRemapper; +import jdk.internal.org.objectweb.asm.tree.ClassNode; +import jdk.internal.org.objectweb.asm.tree.MethodNode; +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; + +/** + * This class will merge (some) methods from one class into another one. + * + * @author Staffan Larsen + */ +@Deprecated +final class JIMethodMergeAdapter extends ClassVisitor { + + private final ClassNode cn; + private final List methodFilter; + private final Map typeMap; + + /** + * Methods in methodFilter that exist in cn will be merged into cv. If the method already exists, + * the original method will be deleted. + * + * @param cv + * @param cn - a ClassNode with Methods that will be merged into this class + * @param methodFilter - only methods in this list will be merged + * @param typeMappings - while merging, type references in the methods will be changed according to this map + */ + public JIMethodMergeAdapter(ClassVisitor cv, ClassNode cn, List methodFilter, JITypeMapping[] typeMappings) { + super(Opcodes.ASM7, cv); + this.cn = cn; + this.methodFilter = methodFilter; + + this.typeMap = new HashMap<>(); + for (JITypeMapping tm : typeMappings) { + typeMap.put(tm.from().replace('.', '/'), tm.to().replace('.', '/')); + } + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + super.visit(version, access, name, signature, superName, interfaces); + typeMap.put(cn.name, name); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + if(methodInFilter(name, desc)) { + // If the method is one that we will be replacing, delete the method + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Deleting " + name + desc); + return null; + } + return super.visitMethod(access, name, desc, signature, exceptions); + } + + @Override + public void visitEnd() { + SimpleRemapper remapper = new SimpleRemapper(typeMap); + for (MethodNode mn : cn.methods) { + // Check if the method is in the list of methods to copy + if (methodInFilter(mn.name, mn.desc)) { + if (Logger.shouldLog(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG)) { + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, "Copying method: " + mn.name + mn.desc); + Logger.log(LogTag.JFR_SYSTEM_BYTECODE, LogLevel.DEBUG, " with mapper: " + typeMap); + } + + String[] exceptions = new String[mn.exceptions.size()]; + mn.exceptions.toArray(exceptions); + MethodVisitor mv = cv.visitMethod(mn.access, mn.name, mn.desc, mn.signature, exceptions); + mn.instructions.resetLabels(); + mn.accept(new RemappingMethodAdapter(mn.access, mn.desc, mv, remapper)); + } + } + super.visitEnd(); + } + + private boolean methodInFilter(String name, String desc) { + for(Method m : methodFilter) { + if (m.getName().equals(name) && Type.getMethodDescriptor(m).equals(desc)) { + return true; + } + } + return false; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java new file mode 100644 index 0000000000000..f8a356ac69300 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JITypeMapping.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.instrument; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JITypeMapping { + String from(); + String to(); +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java index 165419cc34a52..a402ed9f85431 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/ManagementSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,6 @@ import jdk.jfr.EventType; import jdk.jfr.Recording; import jdk.jfr.consumer.EventStream; -import jdk.jfr.internal.JDKEvents; import jdk.jfr.internal.JVMSupport; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; @@ -58,6 +57,7 @@ import jdk.jfr.internal.consumer.AbstractEventStream; import jdk.jfr.internal.consumer.EventDirectoryStream; import jdk.jfr.internal.consumer.FileAccess; +import jdk.jfr.internal.instrument.JDKEvents; /** * The management API in module jdk.management.jfr should be built on top of the From a086c323979066a3d5dd65dcd0b444b8b0ff1018 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Mon, 13 May 2024 02:00:25 +0200 Subject: [PATCH 06/10] Improve comments. Fix nit --- src/java.base/share/classes/java/io/FileInputStream.java | 7 +++++-- src/java.base/share/classes/java/io/FileOutputStream.java | 7 +++++-- src/java.base/share/classes/java/io/RandomAccessFile.java | 5 ++++- src/java.base/share/classes/java/lang/Throwable.java | 3 ++- .../share/classes/sun/nio/ch/FileChannelImpl.java | 6 +++--- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index 389e6b67270d1..e6e2e1ac2dab2 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -60,8 +60,11 @@ public class FileInputStream extends InputStream { private static final int DEFAULT_BUFFER_SIZE = 8192; - // Flag that determines if file reads should be traced by JFR - static boolean jfrTracing; + /** + * Flag set by jdk.internal.event.JFRTracing to determines if + * file reads should be traced by JFR. + */ + private static boolean jfrTracing; /* File Descriptor - handle to the open file */ private final FileDescriptor fd; diff --git a/src/java.base/share/classes/java/io/FileOutputStream.java b/src/java.base/share/classes/java/io/FileOutputStream.java index 35f0938d361c0..bb8e0b40cdb47 100644 --- a/src/java.base/share/classes/java/io/FileOutputStream.java +++ b/src/java.base/share/classes/java/io/FileOutputStream.java @@ -69,8 +69,11 @@ public class FileOutputStream extends OutputStream private static final JavaIOFileDescriptorAccess FD_ACCESS = SharedSecrets.getJavaIOFileDescriptorAccess(); - // Flag that determines if file writes should be traced by JFR - static boolean jfrTracing; + /** + * Flag set by jdk.internal.event.JFRTracing to determines if + * file writes should be traced by JFR. + */ + private static boolean jfrTracing; /** * The system dependent file descriptor. diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index bb43b6dc2f613..b0d8f9fe905f8 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -70,7 +70,10 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable { private static final int O_DSYNC = 8; private static final int O_TEMPORARY = 16; - // Flag that determines if file reads/writes should be traced by JFR + /** + * Flag set by jdk.internal.event.JFRTracing to determines if + * file reads and writes should be traced by JFR. + */ private static boolean jfrTracing; private final FileDescriptor fd; diff --git a/src/java.base/share/classes/java/lang/Throwable.java b/src/java.base/share/classes/java/lang/Throwable.java index 2e78dbc1c0880..44ca5154aff23 100644 --- a/src/java.base/share/classes/java/lang/Throwable.java +++ b/src/java.base/share/classes/java/lang/Throwable.java @@ -120,7 +120,8 @@ public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; /** - * Flag that determines if exceptions should be traced by JFR + * Flag set by jdk.internal.event.JFRTracing to determines if + * exceptions should be traced by JFR. */ static volatile boolean jfrTracing; diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index 8689910bf3a7a..a2c492079dd7e 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -74,7 +74,8 @@ public class FileChannelImpl // Used to make native read and write calls private static final FileDispatcher nd = new FileDispatcherImpl(); - // Flag that determines if file reads/writes should be traced by JFR + // Flag set by jdk.internal.event.JFRTracing to determines if + // file reads and writes should be traced by JFR. private static boolean jfrTracing; // File descriptor @@ -415,8 +416,7 @@ public long write(ByteBuffer[] srcs, int offset, int length) throws IOException return implWrite(srcs, offset, length); } - private long implWrite(ByteBuffer[] srcs, int offset, int length) throws IOException - { + private long implWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { Objects.checkFromIndexSize(offset, length, srcs.length); ensureOpen(); if (!writable) From f2439ac3487e0ad5e1128f26ad8fd1755ea4f36e Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Mon, 13 May 2024 02:01:50 +0200 Subject: [PATCH 07/10] Revert accidental push --- webrev.zip | Bin 179357 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 webrev.zip diff --git a/webrev.zip b/webrev.zip deleted file mode 100644 index 0d5ce44cff1a622ddbb52ca5704bbccb20147ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179357 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∨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 From c4c6477476ece219a84873962bf8d14503094d0f Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Thu, 16 May 2024 14:05:43 +0200 Subject: [PATCH 08/10] Remove dependency on JFR for retransformation --- ...ClassJFR.java => RedefineSharedClass.java} | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) rename test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/{RedefineSharedClassJFR.java => RedefineSharedClass.java} (80%) diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClassJFR.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClass.java similarity index 80% rename from test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClassJFR.java rename to test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClass.java index bf6216ae85a07..f8c73173f60b1 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClassJFR.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineSharedClass.java @@ -24,16 +24,18 @@ /* * @test * @bug 8306929 - * @summary Verify should_clean_previous_versions when run with JFR and CDS + * @summary Verify should_clean_previous_versions when run with retransformation and CDS * @requires vm.jvmti * @requires vm.cds - * @requires vm.hasJFR * @requires vm.opt.final.ClassUnloading * @requires vm.flagless * @library /test/lib - * @run driver RedefineSharedClassJFR xshare-off - * @run driver RedefineSharedClassJFR xshare-on + * @run main RedefineClassHelper + * @run driver RedefineSharedClass xshare-off + * @run driver RedefineSharedClass xshare-on */ +import java.io.InputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -43,7 +45,7 @@ import jtreg.SkippedException; -public class RedefineSharedClassJFR { +public class RedefineSharedClass { private static final String SHOULD_CLEAN_TRUE = "Class unloading: should_clean_previous_versions = true"; private static final String SHOULD_CLEAN_FALSE = "Class unloading: should_clean_previous_versions = false"; @@ -56,16 +58,16 @@ public static void main(String[] args) throws Exception { throw new SkippedException("Supported platform"); } - // Test is run with JFR which will transform a number of classes. Depending - // on if the test is run with or without CDS the output will be different, - // due to the fact that shared classes can never be cleaned out after retranform. + // The test will redefine a single class below and depending on if the test + // is run with or without CDS the output will be different, due to the fact + // that shared classes can never be cleaned out after retranform. if (args.length > 0) { // When run with an argument the class is used as driver and should parse // the output to verify it is correct given the command line. List baseCommand = List.of( - "-XX:StartFlightRecording", + "-javaagent:redefineagent.jar", "-Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace", - "RedefineSharedClassJFR"); + "RedefineSharedClass"); if (args[0].equals("xshare-off")) { // First case is with -Xshare:off. In this case no classes are shared @@ -104,8 +106,17 @@ public static void main(String[] args) throws Exception { } } - // When run without any argument this class acts as test and we do a system GC - // to trigger cleaning and get the output we want to check. + // When run without arguments this class acts as the test. First redefining + // a class that we expect to be in the archive if used and the triggering a + // System.gc() to clean up. + RedefineClassHelper.redefineClass(java.io.RandomAccessFile.class, getClassBytes(java.io.RandomAccessFile.class)); System.gc(); } + + private static byte[] getClassBytes(Class clazz) throws IOException { + String name = "/" + clazz.getName().replace(".", "/") + ".class"; + try (InputStream is = clazz.getResourceAsStream(name)) { + return is.readAllBytes(); + } + } } From 8a44b649727bfd010a6a8e596957726b986919f7 Mon Sep 17 00:00:00 2001 From: egahlin Date: Tue, 28 May 2024 13:17:51 +0200 Subject: [PATCH 09/10] Fix typos --- src/java.base/share/classes/java/io/FileInputStream.java | 2 +- src/java.base/share/classes/java/io/FileOutputStream.java | 2 +- src/java.base/share/classes/java/io/RandomAccessFile.java | 2 +- src/java.base/share/classes/java/lang/Throwable.java | 2 +- src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index e6e2e1ac2dab2..9d5ebbb63df6c 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -61,7 +61,7 @@ public class FileInputStream extends InputStream private static final int DEFAULT_BUFFER_SIZE = 8192; /** - * Flag set by jdk.internal.event.JFRTracing to determines if + * Flag set by jdk.internal.event.JFRTracing to indicate if * file reads should be traced by JFR. */ private static boolean jfrTracing; diff --git a/src/java.base/share/classes/java/io/FileOutputStream.java b/src/java.base/share/classes/java/io/FileOutputStream.java index bb8e0b40cdb47..1906487d83ebd 100644 --- a/src/java.base/share/classes/java/io/FileOutputStream.java +++ b/src/java.base/share/classes/java/io/FileOutputStream.java @@ -70,7 +70,7 @@ public class FileOutputStream extends OutputStream SharedSecrets.getJavaIOFileDescriptorAccess(); /** - * Flag set by jdk.internal.event.JFRTracing to determines if + * Flag set by jdk.internal.event.JFRTracing to indicate if * file writes should be traced by JFR. */ private static boolean jfrTracing; diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index b0d8f9fe905f8..c2758453cf492 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -71,7 +71,7 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable { private static final int O_TEMPORARY = 16; /** - * Flag set by jdk.internal.event.JFRTracing to determines if + * Flag set by jdk.internal.event.JFRTracing to indicate if * file reads and writes should be traced by JFR. */ private static boolean jfrTracing; diff --git a/src/java.base/share/classes/java/lang/Throwable.java b/src/java.base/share/classes/java/lang/Throwable.java index 44ca5154aff23..275961a9a9f18 100644 --- a/src/java.base/share/classes/java/lang/Throwable.java +++ b/src/java.base/share/classes/java/lang/Throwable.java @@ -120,7 +120,7 @@ public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; /** - * Flag set by jdk.internal.event.JFRTracing to determines if + * Flag set by jdk.internal.event.JFRTracing to indicate if * exceptions should be traced by JFR. */ static volatile boolean jfrTracing; diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index a2c492079dd7e..867fc86120b3e 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -74,7 +74,7 @@ public class FileChannelImpl // Used to make native read and write calls private static final FileDispatcher nd = new FileDispatcherImpl(); - // Flag set by jdk.internal.event.JFRTracing to determines if + // Flag set by jdk.internal.event.JFRTracing to indicate if // file reads and writes should be traced by JFR. private static boolean jfrTracing; From 87647f9d728238419c801fa5b07af11f92da42e7 Mon Sep 17 00:00:00 2001 From: egahlin Date: Tue, 28 May 2024 14:22:21 +0200 Subject: [PATCH 10/10] Reduce clutter --- .../classes/java/io/FileInputStream.java | 12 ++----- .../classes/java/io/FileOutputStream.java | 14 ++------- .../classes/java/io/RandomAccessFile.java | 22 +++---------- .../classes/sun/nio/ch/FileChannelImpl.java | 31 ++++--------------- 4 files changed, 16 insertions(+), 63 deletions(-) diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index 9d5ebbb63df6c..20bf57a56c77a 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -229,7 +229,7 @@ private void open(String name) throws FileNotFoundException { */ @Override public int read() throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceRead0(); } return read0(); @@ -238,9 +238,6 @@ public int read() throws IOException { private native int read0() throws IOException; private int traceRead0() throws IOException { - if (!FileReadEvent.enabled()) { - return read0(); - } int result = 0; boolean endOfFile = false; long bytesRead = 0; @@ -272,9 +269,6 @@ private int traceRead0() throws IOException { private native int readBytes(byte[] b, int off, int len) throws IOException; private int traceReadBytes(byte b[], int off, int len) throws IOException { - if (!FileReadEvent.enabled()) { - return readBytes(b, off, len); - } int bytesRead = 0; long start = 0; try { @@ -306,7 +300,7 @@ private int traceReadBytes(byte b[], int off, int len) throws IOException { */ @Override public int read(byte[] b) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceReadBytes(b, 0, b.length); } return readBytes(b, 0, b.length); @@ -328,7 +322,7 @@ public int read(byte[] b) throws IOException { */ @Override public int read(byte[] b, int off, int len) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceReadBytes(b, off, len); } return readBytes(b, off, len); diff --git a/src/java.base/share/classes/java/io/FileOutputStream.java b/src/java.base/share/classes/java/io/FileOutputStream.java index 1906487d83ebd..b8c26f38143fb 100644 --- a/src/java.base/share/classes/java/io/FileOutputStream.java +++ b/src/java.base/share/classes/java/io/FileOutputStream.java @@ -305,10 +305,6 @@ private void open(String name, boolean append) throws FileNotFoundException { private native void write(int b, boolean append) throws IOException; private void traceWrite(int b, boolean append) throws IOException { - if (!FileWriteEvent.enabled()) { - write(b, append); - return; - } long bytesWritten = 0; long start = 0; try { @@ -333,7 +329,7 @@ private void traceWrite(int b, boolean append) throws IOException { @Override public void write(int b) throws IOException { boolean append = FD_ACCESS.getAppend(fd); - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { traceWrite(b, append); return; } @@ -353,10 +349,6 @@ private native void writeBytes(byte[] b, int off, int len, boolean append) throws IOException; private void traceWriteBytes(byte b[], int off, int len, boolean append) throws IOException { - if (!FileWriteEvent.enabled()) { - writeBytes(b, off, len, append); - return; - } long bytesWritten = 0; long start = 0; try { @@ -381,7 +373,7 @@ private void traceWriteBytes(byte b[], int off, int len, boolean append) throws @Override public void write(byte[] b) throws IOException { boolean append = FD_ACCESS.getAppend(fd); - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { traceWriteBytes(b, 0, b.length, append); return; } @@ -401,7 +393,7 @@ public void write(byte[] b) throws IOException { @Override public void write(byte[] b, int off, int len) throws IOException { boolean append = FD_ACCESS.getAppend(fd); - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { traceWriteBytes(b, off, len, append); return; } diff --git a/src/java.base/share/classes/java/io/RandomAccessFile.java b/src/java.base/share/classes/java/io/RandomAccessFile.java index c2758453cf492..d0dde87bdca69 100644 --- a/src/java.base/share/classes/java/io/RandomAccessFile.java +++ b/src/java.base/share/classes/java/io/RandomAccessFile.java @@ -384,7 +384,7 @@ private void open(String name, int mode) throws FileNotFoundException { * end-of-file has been reached. */ public int read() throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceRead0(); } return read0(); @@ -393,9 +393,6 @@ public int read() throws IOException { private native int read0() throws IOException; private int traceRead0() throws IOException { - if (!FileReadEvent.enabled()) { - return read0(); - } int result = 0; long bytesRead = 0; boolean endOfFile = false; @@ -425,7 +422,7 @@ private int traceRead0() throws IOException { * @throws IOException If an I/O error has occurred. */ private int readBytes(byte[] b, int off, int len) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceReadBytes0(b, off, len); } return readBytes0(b, off, len); @@ -434,9 +431,6 @@ private int readBytes(byte[] b, int off, int len) throws IOException { private native int readBytes0(byte[] b, int off, int len) throws IOException; private int traceReadBytes0(byte b[], int off, int len) throws IOException { - if (!FileReadEvent.enabled()) { - return readBytes0(b, off, len); - } int bytesRead = 0; long start = 0; try { @@ -598,7 +592,7 @@ public int skipBytes(int n) throws IOException { * @throws IOException if an I/O error occurs. */ public void write(int b) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { traceImplWrite(b); return; } @@ -615,10 +609,6 @@ private void implWrite(int b) throws IOException { } private void traceImplWrite(int b) throws IOException { - if (!FileWriteEvent.enabled()) { - implWrite(b); - return; - } long bytesWritten = 0; long start = 0; try { @@ -644,7 +634,7 @@ private void traceImplWrite(int b) throws IOException { * @throws IOException If an I/O error has occurred. */ private void writeBytes(byte[] b, int off, int len) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { traceImplWriteBytes(b, off, len); return; } @@ -661,10 +651,6 @@ private void implWriteBytes(byte[] b, int off, int len) throws IOException { } private void traceImplWriteBytes(byte b[], int off, int len) throws IOException { - if (!FileWriteEvent.enabled()) { - implWriteBytes(b, off, len); - return; - } long bytesWritten = 0; long start = 0; try { diff --git a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index 867fc86120b3e..f65a390074059 100644 --- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -225,7 +225,7 @@ protected void implCloseChannel() throws IOException { @Override public int read(ByteBuffer dst) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceImplRead(dst); } return implRead(dst); @@ -263,9 +263,6 @@ private int implRead(ByteBuffer dst) throws IOException { } private int traceImplRead(ByteBuffer dst) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dst); - } int bytesRead = 0; long start = 0; try { @@ -286,7 +283,7 @@ private int traceImplRead(ByteBuffer dst) throws IOException { @Override public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceImplRead(dsts, offset, length); } return implRead(dsts, offset, length); @@ -328,9 +325,6 @@ private long implRead(ByteBuffer[] dsts, int offset, int length) } private long traceImplRead(ByteBuffer[] dsts, int offset, int length) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dsts, offset, length); - } long bytesRead = 0; long start = 0; try { @@ -351,7 +345,7 @@ private long traceImplRead(ByteBuffer[] dsts, int offset, int length) throws IOE @Override public int write(ByteBuffer src) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { return traceImplWrite(src); } return implWrite(src); @@ -390,9 +384,6 @@ private int implWrite(ByteBuffer src) throws IOException { } private int traceImplWrite(ByteBuffer src) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(src); - } int bytesWritten = 0; long start = 0; try { @@ -410,7 +401,7 @@ private int traceImplWrite(ByteBuffer src) throws IOException { @Override public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileWriteEvent.enabled()) { return traceImplWrite(srcs, offset, length); } return implWrite(srcs, offset, length); @@ -449,9 +440,6 @@ private long implWrite(ByteBuffer[] srcs, int offset, int length) throws IOExcep } private long traceImplWrite(ByteBuffer[] srcs, int offset, int length) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(srcs, offset, length); - } long bytesWritten = 0; long start = 0; try { @@ -1140,7 +1128,7 @@ public long transferFrom(ReadableByteChannel src, long position, long count) @Override public int read(ByteBuffer dst, long position) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceImplRead(dst, position); } return implRead(dst, position); @@ -1166,9 +1154,6 @@ private int implRead(ByteBuffer dst, long position) throws IOException { } private int traceImplRead(ByteBuffer dst, long position) throws IOException { - if (!FileReadEvent.enabled()) { - return implRead(dst, position); - } int bytesRead = 0; long start = 0; try { @@ -1215,7 +1200,7 @@ private int readInternal(ByteBuffer dst, long position) throws IOException { @Override public int write(ByteBuffer src, long position) throws IOException { - if (jfrTracing) { + if (jfrTracing && FileReadEvent.enabled()) { return traceImplWrite(src, position); } return implWrite(src, position); @@ -1241,10 +1226,6 @@ private int implWrite(ByteBuffer src, long position) throws IOException { } private int traceImplWrite(ByteBuffer src, long position) throws IOException { - if (!FileWriteEvent.enabled()) { - return implWrite(src, position); - } - int bytesWritten = 0; long start = 0; try {