// Path: user/src/main/java/com/offbynull/coroutines/user/SerializationUtils.java
// static final class FrameUpdatePointKey {
// 
//     private final String className;
//     private final int methodId;
//     private final int continuationPointId;
// 
//     FrameUpdatePointKey(String className, int methodId, int continuationPointId) {
//         if (className == null) {
//             throw new NullPointerException();
//         }
// 
//         this.className = className;
//         this.methodId = methodId;
//         this.continuationPointId = continuationPointId;
//     }
// 
//     public int hashCode() {
//         int hash = 7;
//         hash = 71 * hash + (this.className != null ? this.className.hashCode() : 0);
//         hash = 71 * hash + this.methodId;
//         hash = 71 * hash + this.continuationPointId;
//         return hash;
//     }
// 
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final FrameUpdatePointKey other = (FrameUpdatePointKey) obj;
//         if (this.methodId != other.methodId) {
//             return false;
//         }
//         if (this.continuationPointId != other.continuationPointId) {
//             return false;
//         }
//         if ((this.className == null) ? (other.className != null) : !this.className.equals(other.className)) {
//             return false;
//         }
//         return true;
//     }
// }
// 
// Path: user/src/main/java/com/offbynull/coroutines/user/SerializationUtils.java
// static final class FrameUpdatePointValue {
//     private final FrameModifier frameModifier;
// 
//     FrameUpdatePointValue(FrameModifier frameModifier) {
//         if (frameModifier == null) {
//             throw new NullPointerException();
//         }
//         this.frameModifier = frameModifier;
//     }        
// }


import com.offbynull.coroutines.user.SerializationUtils.FrameUpdatePointKey;
import com.offbynull.coroutines.user.SerializationUtils.FrameUpdatePointValue;
import java.io.Serializable;
    public static final class FrameUpdatePoint {

        private final String className;
        private final int methodId;
        private final int continuationPointId;
        private final FrameModifier frameModifier;

        /**
         * Constructs a {@link FrameUpdatePoint} object.
         * @param className class name for the continuation point
         * @param methodId method id (used to identify method)
         * @param continuationPointId continuation point ID
         * @param frameModifier logic to modify the frame's contents to the new version
         * @throws NullPointerException if any argument is {@code null}
         * @throws IllegalArgumentException if {@code continuationPointId < 0}, or if {@code oldMethodId == @code newMethodId}
         */
        public FrameUpdatePoint(String className, int methodId, int continuationPointId, FrameModifier frameModifier) {
            if (frameModifier == null) {
                throw new NullPointerException();
            }
            if (continuationPointId < 0) {
                throw new IllegalArgumentException("Negative continuation point");
            }

            this.className = className;
            this.methodId = methodId;
            this.continuationPointId = continuationPointId;
            this.frameModifier = frameModifier;
        }

// Path: user/src/main/java/com/offbynull/coroutines/user/SerializationUtils.java
// static final class FrameUpdatePointKey {
// 
//     private final String className;
//     private final int methodId;
//     private final int continuationPointId;
// 
//     FrameUpdatePointKey(String className, int methodId, int continuationPointId) {
//         if (className == null) {
//             throw new NullPointerException();
//         }
// 
//         this.className = className;
//         this.methodId = methodId;
//         this.continuationPointId = continuationPointId;
//     }
// 
//     public int hashCode() {
//         int hash = 7;
//         hash = 71 * hash + (this.className != null ? this.className.hashCode() : 0);
//         hash = 71 * hash + this.methodId;
//         hash = 71 * hash + this.continuationPointId;
//         return hash;
//     }
// 
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final FrameUpdatePointKey other = (FrameUpdatePointKey) obj;
//         if (this.methodId != other.methodId) {
//             return false;
//         }
//         if (this.continuationPointId != other.continuationPointId) {
//             return false;
//         }
//         if ((this.className == null) ? (other.className != null) : !this.className.equals(other.className)) {
//             return false;
//         }
//         return true;
//     }
// }
// 
// Path: user/src/main/java/com/offbynull/coroutines/user/SerializationUtils.java
// static final class FrameUpdatePointValue {
//     private final FrameModifier frameModifier;
// 
//     FrameUpdatePointValue(FrameModifier frameModifier) {
//         if (frameModifier == null) {
//             throw new NullPointerException();
//         }
//         this.frameModifier = frameModifier;
//     }        
// }


// Path: user/src/main/java/com/offbynull/coroutines/user/SerializedState.java
import com.offbynull.coroutines.user.SerializationUtils.FrameUpdatePointKey;
import com.offbynull.coroutines.user.SerializationUtils.FrameUpdatePointValue;
import java.io.Serializable;

    public static final class FrameUpdatePoint {

        private final String className;
        private final int methodId;
        private final int continuationPointId;
        private final FrameModifier frameModifier;

        /**
         * Constructs a {@link FrameUpdatePoint} object.
         * @param className class name for the continuation point
         * @param methodId method id (used to identify method)
         * @param continuationPointId continuation point ID
         * @param frameModifier logic to modify the frame's contents to the new version
         * @throws NullPointerException if any argument is {@code null}
         * @throws IllegalArgumentException if {@code continuationPointId < 0}, or if {@code oldMethodId == @code newMethodId}
         */
        public FrameUpdatePoint(String className, int methodId, int continuationPointId, FrameModifier frameModifier) {
            if (frameModifier == null) {
                throw new NullPointerException();
            }
            if (continuationPointId < 0) {
                throw new IllegalArgumentException("Negative continuation point");
            }

            this.className = className;
            this.methodId = methodId;
            this.continuationPointId = continuationPointId;
            this.frameModifier = frameModifier;
        }

        FrameUpdatePointKey toKey() {