// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/AbstractPost.java
// public class AbstractPost extends Annotatable {
//     @Expose(serialize = false)
//     private User user;
//     @Expose(serialize = false)
//     private Date createdAt;
//     private String text;
//     @Expose(serialize = false)
//     private String html;
//     @Expose(serialize = false)
//     private App source;
//     private String replyTo;
//     @Expose(serialize = false)
//     private String threadId;
//     @Expose(serialize = false)
//     private int numReplies;
//     private Entities entities;
//     @Expose(serialize = false)
//     private boolean isDeleted;
//     private boolean machineOnly;
// 
//     public AbstractPost() {}
// 
//     public AbstractPost(String text) {
//         this.text = text;
//         this.machineOnly = false;
//     }
// 
//     public AbstractPost(boolean machineOnly) {
//         this.machineOnly = machineOnly;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public Date getCreatedAt() {
//         return createdAt;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
//     public void setText(String text) {
//         this.text = text;
//     }
// 
//     public String getHtml() {
//         return html;
//     }
// 
//     public App getSource() {
//         return source;
//     }
// 
//     public String getReplyTo() {
//         return replyTo;
//     }
// 
//     public void setReplyTo(String replyTo) {
//         this.replyTo = replyTo;
//     }
// 
//     public String getThreadId() {
//         return threadId;
//     }
// 
//     public int getNumReplies() {
//         return numReplies;
//     }
// 
//     public Entities getEntities() {
//         return entities;
//     }
// 
//     public void setEntities(Entities entities) {
//         this.entities = entities;
//     }
// 
//     public boolean isDeleted() {
//         return isDeleted;
//     }
// 
//     public boolean isMachineOnly() {
//         return machineOnly;
//     }
// 
//     public void setMachineOnly(boolean machineOnly) {
//         this.machineOnly = machineOnly;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/Annotatable.java
// public abstract class Annotatable implements IPageableAppDotNetIdObject {
//     @Expose(serialize = false)
//     protected String id;
//     @Expose(serialize = false)
//     protected String paginationId;
//     protected ArrayList<Annotation> annotations;
// 
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public String getPaginationId() {
//         return paginationId;
//     }
// 
//     public boolean hasAnnotations() {
//         return annotations != null && annotations.size() > 0;
//     }
// 
//     public ArrayList<Annotation> getAnnotations() {
//         return annotations;
//     }
// 
//     public void setAnnotations(ArrayList<Annotation> annotations) {
//         this.annotations = annotations;
//     }
// 
//     public boolean addAnnotation(Annotation annotation) {
//         if (annotations == null)
//             annotations = new ArrayList<Annotation>();
// 
//         return annotations.add(annotation);
//     }
// 
//     public Annotation removeAnnotation(int index) {
//         if (annotations == null)
//             return null;
// 
//         return annotations.remove(index);
//     }
// 
//     public void clearAnnotations() {
//         annotations = null;
//     }
// 
//     public Annotation getFirstAnnotationOfType(String annotationType) {
//         if(annotations != null) {
//             for(Annotation a : annotations) {
//                 if(a.getType().equals(annotationType)) {
//                     return a;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public List<Annotation> getAnnotationsOfType(String annotationType) {
//         ArrayList<Annotation> typedAnnotations = new ArrayList<Annotation>();
//         if(annotations != null) {
//             for(Annotation a : annotations) {
//                 if(a.getType().equals(annotationType)) {
//                     typedAnnotations.add(a);
//                 }
//             }
//         }
//         return typedAnnotations;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/Count.java
// public class Count implements IAppDotNetObject {
//     private int value;
// 
//     public Count(int value) {
//         this.value = value;
//     }
// 
//     public int getValue() {
//         return value;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/IAppDotNetObject.java
// public interface IAppDotNetObject {}


import com.alwaysallthetime.adnlib.data.AbstractPost;
import com.alwaysallthetime.adnlib.data.Annotatable;
import com.alwaysallthetime.adnlib.data.Count;
import com.alwaysallthetime.adnlib.data.IAppDotNetObject;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import java.util.Date;
     * @return a Gson instance
     */
    public static Gson getInstance() {
        return instance;
    }

    /**
     * A Gson instance suitable for disk persistence, in that it will serialize and deserialize all fields.
     *
     * @return a Gson instance
     */
    public static Gson getPersistenceInstance() {
        return persistenceInstance;
    }

    /**
     * A Gson instance without certain customer adapters. This allows those adapters to get the "default" serialization
     * before modifying it.
     *
     * @return a Gson instance
     */
    static Gson getAdapterSafeInstance() {
        return adapterSafeInstance;
    }

    private static <T extends IAppDotNetObject> T copy(IAppDotNetObject object, Gson gson) {
        final JsonElement json = gson.toJsonTree(object);
        return (T) gson.fromJson(json, object.getClass());
    }

// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/AbstractPost.java
// public class AbstractPost extends Annotatable {
//     @Expose(serialize = false)
//     private User user;
//     @Expose(serialize = false)
//     private Date createdAt;
//     private String text;
//     @Expose(serialize = false)
//     private String html;
//     @Expose(serialize = false)
//     private App source;
//     private String replyTo;
//     @Expose(serialize = false)
//     private String threadId;
//     @Expose(serialize = false)
//     private int numReplies;
//     private Entities entities;
//     @Expose(serialize = false)
//     private boolean isDeleted;
//     private boolean machineOnly;
// 
//     public AbstractPost() {}
// 
//     public AbstractPost(String text) {
//         this.text = text;
//         this.machineOnly = false;
//     }
// 
//     public AbstractPost(boolean machineOnly) {
//         this.machineOnly = machineOnly;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public Date getCreatedAt() {
//         return createdAt;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
//     public void setText(String text) {
//         this.text = text;
//     }
// 
//     public String getHtml() {
//         return html;
//     }
// 
//     public App getSource() {
//         return source;
//     }
// 
//     public String getReplyTo() {
//         return replyTo;
//     }
// 
//     public void setReplyTo(String replyTo) {
//         this.replyTo = replyTo;
//     }
// 
//     public String getThreadId() {
//         return threadId;
//     }
// 
//     public int getNumReplies() {
//         return numReplies;
//     }
// 
//     public Entities getEntities() {
//         return entities;
//     }
// 
//     public void setEntities(Entities entities) {
//         this.entities = entities;
//     }
// 
//     public boolean isDeleted() {
//         return isDeleted;
//     }
// 
//     public boolean isMachineOnly() {
//         return machineOnly;
//     }
// 
//     public void setMachineOnly(boolean machineOnly) {
//         this.machineOnly = machineOnly;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/Annotatable.java
// public abstract class Annotatable implements IPageableAppDotNetIdObject {
//     @Expose(serialize = false)
//     protected String id;
//     @Expose(serialize = false)
//     protected String paginationId;
//     protected ArrayList<Annotation> annotations;
// 
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public String getPaginationId() {
//         return paginationId;
//     }
// 
//     public boolean hasAnnotations() {
//         return annotations != null && annotations.size() > 0;
//     }
// 
//     public ArrayList<Annotation> getAnnotations() {
//         return annotations;
//     }
// 
//     public void setAnnotations(ArrayList<Annotation> annotations) {
//         this.annotations = annotations;
//     }
// 
//     public boolean addAnnotation(Annotation annotation) {
//         if (annotations == null)
//             annotations = new ArrayList<Annotation>();
// 
//         return annotations.add(annotation);
//     }
// 
//     public Annotation removeAnnotation(int index) {
//         if (annotations == null)
//             return null;
// 
//         return annotations.remove(index);
//     }
// 
//     public void clearAnnotations() {
//         annotations = null;
//     }
// 
//     public Annotation getFirstAnnotationOfType(String annotationType) {
//         if(annotations != null) {
//             for(Annotation a : annotations) {
//                 if(a.getType().equals(annotationType)) {
//                     return a;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public List<Annotation> getAnnotationsOfType(String annotationType) {
//         ArrayList<Annotation> typedAnnotations = new ArrayList<Annotation>();
//         if(annotations != null) {
//             for(Annotation a : annotations) {
//                 if(a.getType().equals(annotationType)) {
//                     typedAnnotations.add(a);
//                 }
//             }
//         }
//         return typedAnnotations;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/Count.java
// public class Count implements IAppDotNetObject {
//     private int value;
// 
//     public Count(int value) {
//         this.value = value;
//     }
// 
//     public int getValue() {
//         return value;
//     }
// }
// 
// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/data/IAppDotNetObject.java
// public interface IAppDotNetObject {}


// Path: ADNLibModule/src/main/java/com/alwaysallthetime/adnlib/gson/AppDotNetGson.java
import com.alwaysallthetime.adnlib.data.AbstractPost;
import com.alwaysallthetime.adnlib.data.Annotatable;
import com.alwaysallthetime.adnlib.data.Count;
import com.alwaysallthetime.adnlib.data.IAppDotNetObject;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import java.util.Date;

     * @return a Gson instance
     */
    public static Gson getInstance() {
        return instance;
    }

    /**
     * A Gson instance suitable for disk persistence, in that it will serialize and deserialize all fields.
     *
     * @return a Gson instance
     */
    public static Gson getPersistenceInstance() {
        return persistenceInstance;
    }

    /**
     * A Gson instance without certain customer adapters. This allows those adapters to get the "default" serialization
     * before modifying it.
     *
     * @return a Gson instance
     */
    static Gson getAdapterSafeInstance() {
        return adapterSafeInstance;
    }

    private static <T extends IAppDotNetObject> T copy(IAppDotNetObject object, Gson gson) {
        final JsonElement json = gson.toJsonTree(object);
        return (T) gson.fromJson(json, object.getClass());
    }

    public static <T extends IAppDotNetObject> T copy(IAppDotNetObject object) {