diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 72ececb..8f0ebdf 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -38,6 +38,7 @@
 	"LOCAL_STATIC_LIBRARIES":              {"static_libs", bpparser.ListType},
 	"LOCAL_WHOLE_STATIC_LIBRARIES":        {"whole_static_libs", bpparser.ListType},
 	"LOCAL_SYSTEM_SHARED_LIBRARIES":       {"system_shared_libs", bpparser.ListType},
+	"LOCAL_HEADER_LIBRARIES":              {"header_libs", bpparser.ListType},
 	"LOCAL_ASFLAGS":                       {"asflags", bpparser.ListType},
 	"LOCAL_CLANG_ASFLAGS":                 {"clang_asflags", bpparser.ListType},
 	"LOCAL_CFLAGS":                        {"cflags", bpparser.ListType},
@@ -572,6 +573,7 @@
 	"BUILD_STATIC_LIBRARY":        "cc_library_static",
 	"BUILD_HOST_SHARED_LIBRARY":   "cc_library_host_shared",
 	"BUILD_HOST_STATIC_LIBRARY":   "cc_library_host_static",
+	"BUILD_HEADER_LIBRARY":        "cc_library_headers",
 	"BUILD_EXECUTABLE":            "cc_binary",
 	"BUILD_HOST_EXECUTABLE":       "cc_binary_host",
 	"BUILD_NATIVE_TEST":           "cc_test",
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 198c610..f45fbbe 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -81,18 +81,7 @@
 }
 
 func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
-	if !library.static() {
-		ctx.subAndroidMk(ret, &library.stripper)
-		ctx.subAndroidMk(ret, &library.relocationPacker)
-	}
-
-	if library.static() {
-		ret.Class = "STATIC_LIBRARIES"
-	} else {
-		ret.Class = "SHARED_LIBRARIES"
-	}
-
-	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
+	writeExportedIncludes := func(w io.Writer) {
 		var exportedIncludes []string
 		for _, flag := range library.exportedFlags() {
 			if strings.HasPrefix(flag, "-I") {
@@ -106,6 +95,50 @@
 		if len(exportedIncludeDeps) > 0 {
 			fmt.Fprintln(w, "LOCAL_EXPORT_C_INCLUDE_DEPS :=", strings.Join(exportedIncludeDeps.Strings(), " "))
 		}
+	}
+
+	if library.static() {
+		ret.Class = "STATIC_LIBRARIES"
+	} else if library.shared() {
+		ctx.subAndroidMk(ret, &library.stripper)
+		ctx.subAndroidMk(ret, &library.relocationPacker)
+
+		ret.Class = "SHARED_LIBRARIES"
+	} else if library.header() {
+		ret.Custom = func(w io.Writer, name, prefix, moduleDir string) error {
+			fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
+			fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
+			fmt.Fprintln(w, "LOCAL_MODULE :=", name)
+
+			archStr := ctx.Target().Arch.ArchType.String()
+			var host bool
+			switch ctx.Target().Os.Class {
+			case android.Host:
+				fmt.Fprintln(w, "LOCAL_MODULE_HOST_ARCH := ", archStr)
+				host = true
+			case android.HostCross:
+				fmt.Fprintln(w, "LOCAL_MODULE_HOST_CROSS_ARCH := ", archStr)
+				host = true
+			case android.Device:
+				fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH := ", archStr)
+			}
+
+			if host {
+				fmt.Fprintln(w, "LOCAL_MODULE_HOST_OS :=", ctx.Target().Os.String())
+				fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
+			}
+
+			writeExportedIncludes(w)
+			fmt.Fprintln(w, "include $(BUILD_HEADER_LIBRARY)")
+
+			return nil
+		}
+
+		return
+	}
+
+	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
+		writeExportedIncludes(w)
 
 		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
 
@@ -118,7 +151,7 @@
 		return nil
 	})
 
-	if !library.static() {
+	if library.shared() {
 		ctx.subAndroidMk(ret, library.baseInstaller)
 	}
 }
diff --git a/cc/check.go b/cc/check.go
index 340464e..d04b145 100644
--- a/cc/check.go
+++ b/cc/check.go
@@ -36,6 +36,8 @@
 			ctx.PropertyErrorf(prop, "Bad flag `%s`, use local_include_dirs or include_dirs instead", flag)
 		} else if inList(flag, config.IllegalFlags) {
 			ctx.PropertyErrorf(prop, "Illegal flag `%s`", flag)
+		} else if flag == "--coverage" {
+			ctx.PropertyErrorf(prop, "Bad flag: `%s`, use native_coverage instead", flag)
 		} else if strings.Contains(flag, " ") {
 			args := strings.Split(flag, " ")
 			if args[0] == "-include" {
@@ -73,6 +75,8 @@
 			ctx.PropertyErrorf(prop, "Bad flag: `%s` is not allowed", flag)
 		} else if strings.HasPrefix(flag, "-Wl,--version-script") {
 			ctx.PropertyErrorf(prop, "Bad flag: `%s`, use version_script instead", flag)
+		} else if flag == "--coverage" {
+			ctx.PropertyErrorf(prop, "Bad flag: `%s`, use native_coverage instead", flag)
 		} else if strings.Contains(flag, " ") {
 			args := strings.Split(flag, " ")
 			if args[0] == "-z" {
diff --git a/cc/library.go b/cc/library.go
index efaf440..f7194e4 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -64,7 +64,9 @@
 		// export headers generated from .proto sources
 		Export_proto_headers bool
 	}
+}
 
+type LibraryMutatedProperties struct {
 	VariantName string `blueprint:"mutated"`
 
 	// Build a static variant
@@ -175,7 +177,8 @@
 // libraryDecorator wraps baseCompiler, baseLinker and baseInstaller to provide library-specific
 // functionality: static vs. shared linkage, reusing object files for shared libraries
 type libraryDecorator struct {
-	Properties LibraryProperties
+	Properties        LibraryProperties
+	MutatedProperties LibraryMutatedProperties
 
 	// For reusing static library objects for shared library
 	reuseObjects Objects
@@ -213,6 +216,7 @@
 	props = append(props, library.baseLinker.linkerProps()...)
 	return append(props,
 		&library.Properties,
+		&library.MutatedProperties,
 		&library.flagExporter.Properties,
 		&library.stripper.StripProperties,
 		&library.relocationPacker.Properties)
@@ -230,11 +234,11 @@
 
 	if library.static() {
 		flags.CFlags = append(flags.CFlags, library.Properties.Static.Cflags...)
-	} else {
+	} else if library.shared() {
 		flags.CFlags = append(flags.CFlags, library.Properties.Shared.Cflags...)
 	}
 
-	if !library.static() {
+	if library.shared() {
 		libName := library.getLibName(ctx)
 		// GCC for Android assumes that -shared means -Bsymbolic, use -Wl,-shared instead
 		sharedFlag := "-Wl,-shared"
@@ -303,7 +307,7 @@
 		srcs := android.PathsForModuleSrc(ctx, library.Properties.Static.Srcs)
 		objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceStaticLibrary,
 			srcs, library.baseCompiler.deps))
-	} else {
+	} else if library.shared() {
 		srcs := android.PathsForModuleSrc(ctx, library.Properties.Shared.Srcs)
 		objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceSharedLibrary,
 			srcs, library.baseCompiler.deps))
@@ -324,7 +328,8 @@
 	buildShared() bool
 
 	// Sets whether a specific variant is static or shared
-	setStatic(bool)
+	setStatic()
+	setShared()
 }
 
 func (library *libraryDecorator) getLibName(ctx ModuleContext) string {
@@ -339,7 +344,7 @@
 		}
 	}
 
-	return name + library.Properties.VariantName
+	return name + library.MutatedProperties.VariantName
 }
 
 func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) {
@@ -362,7 +367,7 @@
 			library.Properties.Static.Whole_static_libs...)
 		deps.StaticLibs = append(deps.StaticLibs, library.Properties.Static.Static_libs...)
 		deps.SharedLibs = append(deps.SharedLibs, library.Properties.Static.Shared_libs...)
-	} else {
+	} else if library.shared() {
 		if ctx.toolchain().Bionic() && !Bool(library.baseLinker.Properties.Nocrt) {
 			if !ctx.sdk() && !ctx.vndk() {
 				deps.CrtBegin = "crtbegin_so"
@@ -395,13 +400,13 @@
 	library.objects = library.objects.Append(objs)
 
 	outputFile := android.PathForModuleOut(ctx,
-		ctx.ModuleName()+library.Properties.VariantName+staticLibraryExtension)
+		ctx.ModuleName()+library.MutatedProperties.VariantName+staticLibraryExtension)
 	builderFlags := flagsToBuilderFlags(flags)
 
 	TransformObjToStaticLib(ctx, library.objects.objFiles, builderFlags, outputFile, objs.tidyFiles)
 
 	library.coverageOutputFile = TransformCoverageFilesToLib(ctx, library.objects, builderFlags,
-		ctx.ModuleName()+library.Properties.VariantName)
+		ctx.ModuleName()+library.MutatedProperties.VariantName)
 
 	library.wholeStaticMissingDeps = ctx.GetMissingDependencies()
 
@@ -522,7 +527,7 @@
 	objs = objs.Append(deps.Objs)
 
 	var out android.Path
-	if library.static() {
+	if library.static() || library.header() {
 		out = library.linkStatic(ctx, flags, deps, objs)
 	} else {
 		out = library.linkShared(ctx, flags, deps, objs)
@@ -555,12 +560,12 @@
 }
 
 func (library *libraryDecorator) buildStatic() bool {
-	return library.Properties.BuildStatic &&
+	return library.MutatedProperties.BuildStatic &&
 		(library.Properties.Static.Enabled == nil || *library.Properties.Static.Enabled)
 }
 
 func (library *libraryDecorator) buildShared() bool {
-	return library.Properties.BuildShared &&
+	return library.MutatedProperties.BuildShared &&
 		(library.Properties.Shared.Enabled == nil || *library.Properties.Shared.Enabled)
 }
 
@@ -587,31 +592,45 @@
 }
 
 func (library *libraryDecorator) static() bool {
-	return library.Properties.VariantIsStatic
+	return library.MutatedProperties.VariantIsStatic
 }
 
-func (library *libraryDecorator) setStatic(static bool) {
-	library.Properties.VariantIsStatic = static
+func (library *libraryDecorator) shared() bool {
+	return library.MutatedProperties.VariantIsShared
+}
+
+func (library *libraryDecorator) header() bool {
+	return !library.static() && !library.shared()
+}
+
+func (library *libraryDecorator) setStatic() {
+	library.MutatedProperties.VariantIsStatic = true
+	library.MutatedProperties.VariantIsShared = false
+}
+
+func (library *libraryDecorator) setShared() {
+	library.MutatedProperties.VariantIsStatic = false
+	library.MutatedProperties.VariantIsShared = true
 }
 
 func (library *libraryDecorator) BuildOnlyStatic() {
-	library.Properties.BuildShared = false
+	library.MutatedProperties.BuildShared = false
 }
 
 func (library *libraryDecorator) BuildOnlyShared() {
-	library.Properties.BuildStatic = false
+	library.MutatedProperties.BuildStatic = false
 }
 
 func (library *libraryDecorator) HeaderOnly() {
-	library.Properties.BuildShared = false
-	library.Properties.BuildStatic = false
+	library.MutatedProperties.BuildShared = false
+	library.MutatedProperties.BuildStatic = false
 }
 
 func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
 	module := newModule(hod, android.MultilibBoth)
 
 	library := &libraryDecorator{
-		Properties: LibraryProperties{
+		MutatedProperties: LibraryMutatedProperties{
 			BuildShared: true,
 			BuildStatic: true,
 		},
@@ -637,8 +656,8 @@
 				static := modules[0].(*Module)
 				shared := modules[1].(*Module)
 
-				static.linker.(libraryInterface).setStatic(true)
-				shared.linker.(libraryInterface).setStatic(false)
+				static.linker.(libraryInterface).setStatic()
+				shared.linker.(libraryInterface).setShared()
 
 				if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
 					sharedCompiler := shared.compiler.(*libraryDecorator)
@@ -652,10 +671,10 @@
 				}
 			} else if library.buildStatic() {
 				modules = mctx.CreateLocalVariations("static")
-				modules[0].(*Module).linker.(libraryInterface).setStatic(true)
+				modules[0].(*Module).linker.(libraryInterface).setStatic()
 			} else if library.buildShared() {
 				modules = mctx.CreateLocalVariations("shared")
-				modules[0].(*Module).linker.(libraryInterface).setStatic(false)
+				modules[0].(*Module).linker.(libraryInterface).setShared()
 			}
 		}
 	}
diff --git a/cc/makevars.go b/cc/makevars.go
index 06b57c9..e4d8fe6 100644
--- a/cc/makevars.go
+++ b/cc/makevars.go
@@ -64,6 +64,9 @@
 	ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS", asanLdflags)
 	ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES", asanLibs)
 
+	ctx.Strict("CFI_EXTRA_CFLAGS", cfiCflags)
+	ctx.Strict("CFI_EXTRA_LDFLAGS", cfiLdflags)
+
 	ctx.Strict("DEFAULT_C_STD_VERSION", config.CStdVersion)
 	ctx.Strict("DEFAULT_CPP_STD_VERSION", config.CppStdVersion)
 	ctx.Strict("DEFAULT_GCC_CPP_STD_VERSION", config.GccCppStdVersion)
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index da3d5c7..6ebd0c4 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -335,7 +335,7 @@
 	module.linker = stub
 	module.installer = stub
 
-	return module, []interface{}{&stub.properties}
+	return module, []interface{}{&stub.properties, &library.MutatedProperties}
 }
 
 func ndkLibraryFactory() (blueprint.Module, []interface{}) {
diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go
index 676d63d..f1bd3b5 100644
--- a/cc/ndk_prebuilt.go
+++ b/cc/ndk_prebuilt.go
@@ -194,7 +194,7 @@
 
 	libName := strings.TrimPrefix(ctx.ModuleName(), "ndk_")
 	libExt := flags.Toolchain.ShlibSuffix()
-	if ndk.Properties.BuildStatic {
+	if ndk.static() {
 		libExt = staticLibraryExtension
 	}
 
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 7eb191f..28c6ef5 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -28,6 +28,12 @@
 	asanCflags  = "-fno-omit-frame-pointer"
 	asanLdflags = "-Wl,-u,__asan_preinit"
 	asanLibs    = "libasan"
+
+	cfiCflags = "-flto -fsanitize-cfi-cross-dso -fvisibility=default " +
+		"-fsanitize-blacklist=external/compiler-rt/lib/cfi/cfi_blacklist.txt"
+	// FIXME: revert the __cfi_check flag when clang is updated to r280031.
+	cfiLdflags = "-flto -fsanitize-cfi-cross-dso -fsanitize=cfi " +
+		"-Wl,-plugin-opt,O1 -Wl,-export-dynamic-symbol=__cfi_check"
 )
 
 type sanitizerType int
@@ -324,12 +330,8 @@
 			flags.LdFlags = append(flags.LdFlags, "-march=armv7-a")
 		}
 		sanitizers = append(sanitizers, "cfi")
-		cfiFlags := []string{"-flto", "-fsanitize=cfi", "-fsanitize-cfi-cross-dso"}
-		flags.CFlags = append(flags.CFlags, cfiFlags...)
-		flags.CFlags = append(flags.CFlags, "-fvisibility=default")
-		flags.LdFlags = append(flags.LdFlags, cfiFlags...)
-		// FIXME: revert the __cfi_check flag when clang is updated to r280031.
-		flags.LdFlags = append(flags.LdFlags, "-Wl,-plugin-opt,O1", "-Wl,-export-dynamic-symbol=__cfi_check")
+		flags.CFlags = append(flags.CFlags, cfiCflags)
+		flags.LdFlags = append(flags.LdFlags, cfiLdflags)
 		if Bool(sanitize.Properties.Sanitize.Diag.Cfi) {
 			diagSanitizers = append(diagSanitizers, "cfi")
 		}
diff --git a/docs/after.png b/docs/after.png
new file mode 100644
index 0000000..fdd14d2
--- /dev/null
+++ b/docs/after.png
Binary files differ
diff --git a/docs/before.png b/docs/before.png
new file mode 100644
index 0000000..a6a1424
--- /dev/null
+++ b/docs/before.png
Binary files differ
diff --git a/docs/clion.md b/docs/clion.md
new file mode 100644
index 0000000..d6ae19a
--- /dev/null
+++ b/docs/clion.md
@@ -0,0 +1,72 @@
+# CLion project generator
+
+Soong can generate CLion projects. This is intended for source code editing
+only. Build should still be done via make/m/mm(a)/mmm(a).
+
+CMakeLists.txt project file generation is enabled via environment variable:
+
+```bash
+$ export SOONG_GEN_CMAKEFILES=1
+$ export SOONG_GEN_CMAKEFILES_DEBUG=1
+```
+
+You can then trigger a full build:
+
+```bash
+$ make -j64
+```
+or build only the project you are interested in:
+
+```bash
+$ make frameworks/native/service/libs/ui
+```
+
+Projects are generated in the ``out`` directory. In the case of libui, the path would
+be:
+
+```bash
+out/development/ide/clion/frameworks/native/libs/ui/libui-arm64-android/CMakeLists.txt
+```
+Note: The generator creates one folder per targetname-architecture-os combination.
+In the case of libui you endup with two projects:
+
+```bash
+$ ls out/development/ide/clion/frameworks/native/libs/ui
+libui-arm64-android libui-arm-android
+```
+
+### Edit multiple projects at once
+To combine several projects into one, you can create super projects
+and place them in:
+
+```bash
+development/ide/clion/[PATH_YOU_WANT]/..
+```
+
+These file will be symbolicaly linked in ``out/development/ide/clion``. All folders
+will also be created there.
+
+An example of a super project for surfaceflinger (using libui and libgui)
+located in development/ide/clion/frameworks/native:
+
+```
+cmake_minimum_required(VERSION 3.6)
+project(native)
+add_subdirectory(services/surfaceflinger)
+add_subdirectory(libs/ui/libui-arm64-android)
+add_subdirectory(libs/gui/libgui-arm64-android)
+```
+
+
+### Flattened filesystem
+
+Upon opening a project it looks like all the folder structure has been
+flattened:
+
+![Flattened View](before.png "")
+
+This is because you need to change the project root. Via Tools > CMake >
+Change Project Root:
+
+![Unflattened View](after.png "")
+
diff --git a/third_party/zip/Android.bp b/third_party/zip/Android.bp
index 044e6f8..ec89c0c 100644
--- a/third_party/zip/Android.bp
+++ b/third_party/zip/Android.bp
@@ -24,6 +24,7 @@
         "android.go",
     ],
     testSrcs: [
+        "android_test.go",
         "reader_test.go",
         "writer_test.go",
         "zip_test.go",
diff --git a/third_party/zip/android.go b/third_party/zip/android.go
index e2e46ff..f3b6055 100644
--- a/third_party/zip/android.go
+++ b/third_party/zip/android.go
@@ -32,6 +32,12 @@
 	fh := &fileHeader
 	fh.Flags |= 0x8
 
+	// The zip64 extras change between the Central Directory and Local File Header, while we use
+	// the same structure for both. The Local File Haeder is taken care of by us writing a data
+	// descriptor with the zip64 values. The Central Directory Entry is written by Close(), where
+	// the zip64 extra is automatically created and appended when necessary.
+	fh.Extra = stripZip64Extras(fh.Extra)
+
 	h := &header{
 		FileHeader: fh,
 		offset:     uint64(w.cw.count),
@@ -70,6 +76,29 @@
 	return err
 }
 
+// Strip any Zip64 extra fields
+func stripZip64Extras(input []byte) []byte {
+	ret := []byte{}
+
+	for len(input) >= 4 {
+		r := readBuf(input)
+		tag := r.uint16()
+		size := r.uint16()
+		if int(size) > len(r) {
+			break
+		}
+		if tag != zip64ExtraId {
+			ret = append(ret, input[:4+size]...)
+		}
+		input = input[4+size:]
+	}
+
+	// Keep any trailing data
+	ret = append(ret, input...)
+
+	return ret
+}
+
 // CreateCompressedHeader adds a file to the zip file using the provied
 // FileHeader for the file metadata.
 // It returns a Writer to which the already compressed file contents
diff --git a/third_party/zip/android_test.go b/third_party/zip/android_test.go
new file mode 100644
index 0000000..cdf66ff
--- /dev/null
+++ b/third_party/zip/android_test.go
@@ -0,0 +1,71 @@
+// Copyright 2017 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package zip
+
+import (
+	"bytes"
+	"testing"
+)
+
+var stripZip64Testcases = []struct {
+	name string
+	in   []byte
+	out  []byte
+}{
+	{
+		name: "empty",
+		in:   []byte{},
+		out:  []byte{},
+	},
+	{
+		name: "trailing data",
+		in:   []byte{1, 2, 3},
+		out:  []byte{1, 2, 3},
+	},
+	{
+		name: "valid non-zip64 extra",
+		in:   []byte{2, 0, 2, 0, 1, 2},
+		out:  []byte{2, 0, 2, 0, 1, 2},
+	},
+	{
+		name: "two valid non-zip64 extras",
+		in:   []byte{2, 0, 2, 0, 1, 2, 2, 0, 0, 0},
+		out:  []byte{2, 0, 2, 0, 1, 2, 2, 0, 0, 0},
+	},
+	{
+		name: "simple zip64 extra",
+		in:   []byte{1, 0, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8},
+		out:  []byte{},
+	},
+	{
+		name: "zip64 extra and valid non-zip64 extra",
+		in:   []byte{1, 0, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 2, 0, 0, 0},
+		out:  []byte{2, 0, 0, 0},
+	},
+	{
+		name: "invalid extra",
+		in:   []byte{0, 0, 8, 0, 0, 0},
+		out:  []byte{0, 0, 8, 0, 0, 0},
+	},
+}
+
+func TestStripZip64Extras(t *testing.T) {
+	for _, testcase := range stripZip64Testcases {
+		got := stripZip64Extras(testcase.in)
+		if !bytes.Equal(got, testcase.out) {
+			t.Errorf("Failed testcase %s\ninput: %v\n want: %v\n  got: %v\n", testcase.name, testcase.in, testcase.out, got)
+		}
+	}
+}
