// Java class java.F is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface F extends R {
    public String toString();
    
}

// Java class java.L is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface L extends R {
    public String toString();
    
}

// Java class java.O is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface O extends R {
    public String toString();
    
}

// Java class java.R is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface R {
    
}

// Java class java.S is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface S extends R {
    public String toString();
    
}

// Java class java.Java is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public abstract class Java {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Java() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    private static final class proxyF implements Seq.Proxy, F {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyF(Seq.Ref ref) { this.ref = ref; }
        
        public native String toString();
    }
    private static final class proxyL implements Seq.Proxy, L {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyL(Seq.Ref ref) { this.ref = ref; }
        
        public native String toString();
    }
    private static final class proxyO implements Seq.Proxy, O {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyO(Seq.Ref ref) { this.ref = ref; }
        
        public native String toString();
    }
    private static final class proxyR implements Seq.Proxy, R {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyR(Seq.Ref ref) { this.ref = ref; }
        
    }
    private static final class proxyS implements Seq.Proxy, S {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyS(Seq.Ref ref) { this.ref = ref; }
        
        public native String toString();
    }
    
    
}
