// Path: big-data-java/src/easy/data/DataInstantiationException.java
// @SuppressWarnings("serial")
// public class DataInstantiationException extends RuntimeException {
// 	public DataInstantiationException(String message) {
// 		super(message);
// 	}
// }
// 
// Path: big-data-java/src/easy/data/field/CompField.java
// public class CompField extends ADataField implements IDataField {
// 	private HashMap<String, IDataField> fieldMap;
// 
// 	public CompField() {
// 		this(null);
// 	}
// 
// 	public CompField(String basePath) {
// 		this(basePath, null);
// 	}
// 
// 	public CompField(String basePath, String description) {
// 		super(basePath, description);
// 		this.fieldMap = new HashMap<String, IDataField>();
// 	}
// 
// 	public IDataField addField(String name, IDataField fld) {
// 		return fieldMap.put(name, fld);
// 	}
// 	
// 	public String[] fieldNames() {
// 		return fieldMap.keySet().toArray(new String[] {});
// 	}
// 	
// 	public Collection<IDataField> fields() {
// 		return fieldMap.values();
// 	}
// 	
// 	public IDataField getField(String name) {
// 		return fieldMap.get(name);
// 	}
// 	
// 	public boolean hasField(String name) {
// 		return fieldMap.containsKey(name);
// 	}
// 
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitCompField(this, this.basePath, this.description, this.fieldMap);
// 	}
// 
// 	public String toString() {
// 		String m = "{_<" + basePath + "> ";
// 		boolean firstDone = false;
// 		for (String k : fieldNames()) {
// 			if (firstDone) { m += ", "; } else { firstDone = true; }
// 			m += (k + ": " + fieldMap.get(k));
// 		}
// 		m += "}";
// 		return m;
// 	}
// 
// }
// 
// Path: big-data-java/src/easy/data/field/IDFVisitor.java
// public interface IDFVisitor<T> {
// 	public T defaultVisit(IDataField df);
// 	public T visitPrimField(PrimField f, String basePath, String description);
// 	public T visitCompField(CompField f, String basePath, String description, HashMap<String, IDataField> fieldMap);
// 	public T visitListField(ListField f, String basePath, String description, String elemPath, IDataField elemField);
// }
// 
// Path: big-data-java/src/easy/data/field/IDataField.java
// public interface IDataField {
// 	public String getDescription();
// 	public <T> T apply(IDFVisitor<T> fv);
// }
// 
// Path: big-data-java/src/easy/data/field/ListField.java
// public class ListField extends ADataField implements IDataField {
// 	private String elemPath;
// 	private IDataField elemField;
// 
// 	public ListField(String basepath, String elempath, IDataField basefld) {
// 		this(basepath, elempath, basefld, null);
// 	}
// 	
// 	public ListField(String basepath, String elemPath, IDataField elemField, String description) {
// 		super(basepath, description);
// 		this.elemPath = elemPath;
// 		this.elemField = elemField;
// 	}
// 	
// 	public String getElemPath() {
// 		return this.elemPath;
// 	}
// 	
// 	public IDataField getElemField() {
// 		return this.elemField;
// 	}
// 
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitListField(this, this.basePath, this.description, this.elemPath, this.elemField);
// 	}
// 
// 	public String toString() {
// 		return "[_<" + basePath + "," + elemPath + "> " + elemField + "]";
// 	}
// 
// }
// 
// Path: big-data-java/src/easy/data/field/PrimField.java
// public class PrimField extends ADataField implements IDataField {
// 	public PrimField() {
// 		super(null, null);
// 	}
// 	
// 	public PrimField(String path) {
// 		super(path, null);
// 	}
// 	
// 	public PrimField(String path, String description) {
// 		super(path, description);
// 	}
// 	
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitPrimField(this, this.basePath, this.description);
// 	}
// 
// 	public String toString() {
// 		return "<" + basePath + ">";
// 	}
// }


import java.lang.reflect.*;
import java.util.*;
import easy.data.DataInstantiationException;
import easy.data.field.CompField;
import easy.data.field.IDFVisitor;
import easy.data.field.IDataField;
import easy.data.field.ListField;
import easy.data.field.PrimField;
import easy.data.sig.*;
import easy.data.util.*;
							} catch (InvocationTargetException e) {
								e.printStackTrace();
							}
						}
						
						return (T) lst;
						
						
					} else { */
						String[] sigflds = new String[cs.getFieldCount()];
						for (int i = 0; i < sigflds.length; i++) {
							sigflds[i] = cs.getFieldName(i);
						}
						String commonPrefix = longestCommonPrefix(sigflds);
						if (commonPrefix == null) commonPrefix = "";
						//System.out.println("prefix: " + commonPrefix);
						int prefixLength = commonPrefix.length();
						if (commonPrefix.endsWith("/"))
							commonPrefix = commonPrefix.substring(0, prefixLength-1);
						if (f.hasField(commonPrefix)) {
							@SuppressWarnings("rawtypes")
							CompSig<?> newsig = new CompSig(cs.getAssociatedClass());
							for (int i = 0; i < sigflds.length; i++) {
								String oldname = sigflds[i];
								String newname = oldname.substring(prefixLength);
								newsig.addField(cs.getFieldSig(i), newname);
							}

							IDataField fsubfld = f.getField(commonPrefix);
							XML fbasexml = basexml;
// Path: big-data-java/src/easy/data/DataInstantiationException.java
// @SuppressWarnings("serial")
// public class DataInstantiationException extends RuntimeException {
// 	public DataInstantiationException(String message) {
// 		super(message);
// 	}
// }
// 
// Path: big-data-java/src/easy/data/field/CompField.java
// public class CompField extends ADataField implements IDataField {
// 	private HashMap<String, IDataField> fieldMap;
// 
// 	public CompField() {
// 		this(null);
// 	}
// 
// 	public CompField(String basePath) {
// 		this(basePath, null);
// 	}
// 
// 	public CompField(String basePath, String description) {
// 		super(basePath, description);
// 		this.fieldMap = new HashMap<String, IDataField>();
// 	}
// 
// 	public IDataField addField(String name, IDataField fld) {
// 		return fieldMap.put(name, fld);
// 	}
// 	
// 	public String[] fieldNames() {
// 		return fieldMap.keySet().toArray(new String[] {});
// 	}
// 	
// 	public Collection<IDataField> fields() {
// 		return fieldMap.values();
// 	}
// 	
// 	public IDataField getField(String name) {
// 		return fieldMap.get(name);
// 	}
// 	
// 	public boolean hasField(String name) {
// 		return fieldMap.containsKey(name);
// 	}
// 
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitCompField(this, this.basePath, this.description, this.fieldMap);
// 	}
// 
// 	public String toString() {
// 		String m = "{_<" + basePath + "> ";
// 		boolean firstDone = false;
// 		for (String k : fieldNames()) {
// 			if (firstDone) { m += ", "; } else { firstDone = true; }
// 			m += (k + ": " + fieldMap.get(k));
// 		}
// 		m += "}";
// 		return m;
// 	}
// 
// }
// 
// Path: big-data-java/src/easy/data/field/IDFVisitor.java
// public interface IDFVisitor<T> {
// 	public T defaultVisit(IDataField df);
// 	public T visitPrimField(PrimField f, String basePath, String description);
// 	public T visitCompField(CompField f, String basePath, String description, HashMap<String, IDataField> fieldMap);
// 	public T visitListField(ListField f, String basePath, String description, String elemPath, IDataField elemField);
// }
// 
// Path: big-data-java/src/easy/data/field/IDataField.java
// public interface IDataField {
// 	public String getDescription();
// 	public <T> T apply(IDFVisitor<T> fv);
// }
// 
// Path: big-data-java/src/easy/data/field/ListField.java
// public class ListField extends ADataField implements IDataField {
// 	private String elemPath;
// 	private IDataField elemField;
// 
// 	public ListField(String basepath, String elempath, IDataField basefld) {
// 		this(basepath, elempath, basefld, null);
// 	}
// 	
// 	public ListField(String basepath, String elemPath, IDataField elemField, String description) {
// 		super(basepath, description);
// 		this.elemPath = elemPath;
// 		this.elemField = elemField;
// 	}
// 	
// 	public String getElemPath() {
// 		return this.elemPath;
// 	}
// 	
// 	public IDataField getElemField() {
// 		return this.elemField;
// 	}
// 
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitListField(this, this.basePath, this.description, this.elemPath, this.elemField);
// 	}
// 
// 	public String toString() {
// 		return "[_<" + basePath + "," + elemPath + "> " + elemField + "]";
// 	}
// 
// }
// 
// Path: big-data-java/src/easy/data/field/PrimField.java
// public class PrimField extends ADataField implements IDataField {
// 	public PrimField() {
// 		super(null, null);
// 	}
// 	
// 	public PrimField(String path) {
// 		super(path, null);
// 	}
// 	
// 	public PrimField(String path, String description) {
// 		super(path, description);
// 	}
// 	
// 	public <T> T apply(IDFVisitor<T> fv) {
// 		return fv.visitPrimField(this, this.basePath, this.description);
// 	}
// 
// 	public String toString() {
// 		return "<" + basePath + ">";
// 	}
// }


// Path: big-data-java/src/easy/data/xml/XMLInstantiator.java
import java.lang.reflect.*;
import java.util.*;
import easy.data.DataInstantiationException;
import easy.data.field.CompField;
import easy.data.field.IDFVisitor;
import easy.data.field.IDataField;
import easy.data.field.ListField;
import easy.data.field.PrimField;
import easy.data.sig.*;
import easy.data.util.*;

							} catch (InvocationTargetException e) {
								e.printStackTrace();
							}
						}
						
						return (T) lst;
						
						
					} else { */
						String[] sigflds = new String[cs.getFieldCount()];
						for (int i = 0; i < sigflds.length; i++) {
							sigflds[i] = cs.getFieldName(i);
						}
						String commonPrefix = longestCommonPrefix(sigflds);
						if (commonPrefix == null) commonPrefix = "";
						//System.out.println("prefix: " + commonPrefix);
						int prefixLength = commonPrefix.length();
						if (commonPrefix.endsWith("/"))
							commonPrefix = commonPrefix.substring(0, prefixLength-1);
						if (f.hasField(commonPrefix)) {
							@SuppressWarnings("rawtypes")
							CompSig<?> newsig = new CompSig(cs.getAssociatedClass());
							for (int i = 0; i < sigflds.length; i++) {
								String oldname = sigflds[i];
								String newname = oldname.substring(prefixLength);
								newsig.addField(cs.getFieldSig(i), newname);
							}

							IDataField fsubfld = f.getField(commonPrefix);
							XML fbasexml = basexml;
							if (!(fsubfld instanceof ListField)) { // only one element of the spec field in the data source