class GAKey {

        private final String groupId;

        private final String artifactId;

        private final int hashCode;

        GAKey(String groupId, String artifactId) {
            this.groupId = (groupId != null) ? groupId : "";
            this.artifactId = (artifactId != null) ? artifactId : "";

            hashCode = Objects.hash(this.groupId, this.artifactId);
        }

        @Override
        public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

        @Override
        public int hashCode() {
            return hashCode;
        }

        @Override
        public String toString() {
            return groupId + ':' + artifactId;
        }
    }

            if (this == obj) {
                return true;
            }
            if (!(obj instanceof GAKey)) {
                return false;
            }
            GAKey that = (GAKey) obj;
            return artifactId.equals(that.artifactId) && groupId.equals(that.groupId);
        
<no_super_class>