// Path: src/c/DeclarationType.java
// public enum DeclarationType {
//     CLASS,
//     CONSTANT,
//     FIELD,
//     METHOD,
//     ENUM,
//     VARIABLE;
// }
// 
// Path: src/c/Method.java
// public interface Method extends Field{
// 
//     public List<Param> getParams();
// 
//     public Method clone();
// 
//     public boolean isStatic();
// }
// 
// Path: src/c/Param.java
// public class Param extends Triple<String, String, String> {
// 
//     public Param() {
//     }
// 
//     public Param(String first, String second) {
//         super(first, second);
//     }
// 
//     //c type, name, javatype
//     public Param(String first, String second, String third) {
//         super(first, second, third);
//     }
// }


import c.DeclarationType;
import c.Method;
import c.Param;
import java.util.ArrayList;
import java.util.List;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Function)) return false;

        Function function = (Function) o;

        if (name != null ? !name.equals(function.name) : function.name != null) return false;
        if (returnType != null ? !returnType.equals(function.returnType) : function.returnType != null) return false;

        if(this.args.size()!= function.args.size()){return false;}

        for(int i = 0; i < args.size(); i++){
            if(!args.get(i).first.equals(function.args.get(i).first)){
                return false;
            }
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = returnType != null ? returnType.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (args != null ? args.hashCode() : 0);
        return result;
    }

    @Override
// Path: src/c/DeclarationType.java
// public enum DeclarationType {
//     CLASS,
//     CONSTANT,
//     FIELD,
//     METHOD,
//     ENUM,
//     VARIABLE;
// }
// 
// Path: src/c/Method.java
// public interface Method extends Field{
// 
//     public List<Param> getParams();
// 
//     public Method clone();
// 
//     public boolean isStatic();
// }
// 
// Path: src/c/Param.java
// public class Param extends Triple<String, String, String> {
// 
//     public Param() {
//     }
// 
//     public Param(String first, String second) {
//         super(first, second);
//     }
// 
//     //c type, name, javatype
//     public Param(String first, String second, String third) {
//         super(first, second, third);
//     }
// }


// Path: src/impl/Function.java
import c.DeclarationType;
import c.Method;
import c.Param;
import java.util.ArrayList;
import java.util.List;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Function)) return false;

        Function function = (Function) o;

        if (name != null ? !name.equals(function.name) : function.name != null) return false;
        if (returnType != null ? !returnType.equals(function.returnType) : function.returnType != null) return false;

        if(this.args.size()!= function.args.size()){return false;}

        for(int i = 0; i < args.size(); i++){
            if(!args.get(i).first.equals(function.args.get(i).first)){
                return false;
            }
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = returnType != null ? returnType.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (args != null ? args.hashCode() : 0);
        return result;
    }

    @Override
    public DeclarationType getDeclType() {