Git Product home page Git Product logo

garble's Introduction

garble

go install mvdan.cc/garble@latest

Obfuscate Go code by wrapping the Go toolchain. Requires Go 1.20 or later.

garble build [build flags] [packages]

The tool also supports garble test to run tests with obfuscated code, garble run to obfuscate and execute simple programs, and garble reverse to de-obfuscate text such as stack traces. Run garble -h to see all available commands and flags.

You can also use go install mvdan.cc/garble@master to install the latest development version.

Purpose

Produce a binary that works as well as a regular build, but that has as little information about the original source code as possible.

The tool is designed to be:

  • Coupled with cmd/go, to support modules and build caching
  • Deterministic and reproducible, given the same initial source code
  • Reversible given the original source, to de-obfuscate panic stack traces

Mechanism

The tool wraps calls to the Go compiler and linker to transform the Go build, in order to:

  • Replace as many useful identifiers as possible with short base64 hashes
  • Replace package paths with short base64 hashes
  • Replace filenames and position information with short base64 hashes
  • Remove all build and module information
  • Strip debugging information and symbol tables via -ldflags="-w -s"
  • Obfuscate literals, if the -literals flag is given
  • Remove extra information, if the -tiny flag is given

By default, the tool obfuscates all the packages being built. You can manually specify which packages to obfuscate via GOGARBLE, a comma-separated list of glob patterns matching package path prefixes. This format is borrowed from GOPRIVATE; see go help private.

Note that commands like garble build will use the go version found in your $PATH. To use different versions of Go, you can install them and set up $PATH with them. For example, for Go 1.17.1:

$ go install golang.org/dl/go1.17.1@latest
$ go1.17.1 download
$ PATH=$(go1.17.1 env GOROOT)/bin:${PATH} garble build

Use cases

A common question is why a code obfuscator is needed for Go, a compiled language. Go binaries include a surprising amount of information about the original source; even with debug information and symbol tables stripped, many names and positions remain in place for the sake of traces, reflection, and debugging.

Some use cases for Go require sharing a Go binary with the end user. If the source code for the binary is private or requires a purchase, its obfuscation can help discourage reverse engineering.

A similar use case is a Go library whose source is private or purchased. Since Go libraries cannot be imported in binary form, and Go plugins have their shortcomings, sharing obfuscated source code becomes an option. See #369.

Obfuscation can also help with aspects entirely unrelated to licensing. For example, the -tiny flag can make binaries 15% smaller, similar to the common practice in Android to reduce app sizes. Obfuscation has also helped some open source developers work around anti-virus scans incorrectly treating Go binaries as malware.

Literal obfuscation

Using the -literals flag causes literal expressions such as strings to be replaced with more complex expressions, resolving to the same value at run-time. String literals injected via -ldflags=-X are also replaced by this flag. This feature is opt-in, as it can cause slow-downs depending on the input code.

Literals used in constant expressions cannot be obfuscated, since they are resolved at compile time. This includes any expressions part of a const declaration, for example.

Tiny mode

With the -tiny flag, even more information is stripped from the Go binary. Position information is removed entirely, rather than being obfuscated. Runtime code which prints panics, fatal errors, and trace/debug info is removed. Many symbol names are also omitted from binary sections at link time. All in all, this can make binaries about 15% smaller.

With this flag, no panics or fatal runtime errors will ever be printed, but they can still be handled internally with recover as normal. In addition, the GODEBUG environmental variable will be ignored.

Note that this flag can make debugging crashes harder, as a panic will simply exit the entire program without printing a stack trace, and source code positions and many names are removed. Similarly, garble reverse is generally not useful in this mode.

Control flow obfuscation

See: CONTROLFLOW.md

Speed

garble build should take about twice as long as go build, as it needs to complete two builds. The original build, to be able to load and type-check the input code, and then the obfuscated build.

Garble obfuscates one package at a time, mirroring how Go compiles one package at a time. This allows Garble to fully support Go's build cache; incremental garble build calls should only re-build and re-obfuscate modified code.

Note that the first call to garble build may be comparatively slow, as it has to obfuscate each package for the first time. This is akin to clearing GOCACHE with go clean -cache and running a go build from scratch.

Garble also makes use of its own cache to reuse work, akin to Go's GOCACHE. It defaults to a directory under your user's cache directory, such as ~/.cache/garble, and can be placed elsewhere by setting GARBLE_CACHE.

Determinism and seeds

Just like Go, garble builds are deterministic and reproducible in nature. This has significant benefits, such as caching builds and being able to use garble reverse to de-obfuscate stack traces.

By default, garble will obfuscate each package in a unique way, which will change if its build input changes: the version of garble, the version of Go, the package's source code, or any build parameter such as GOOS or -tags. This is a reasonable default since guessing those inputs is very hard.

You can use the -seed flag to provide your own obfuscation randomness seed. Reusing the same seed can help produce the same code obfuscation, which can help when debugging or reproducing problems. Regularly rotating the seed can also help against reverse-engineering in the long run, as otherwise one can look at changes in how Go's standard library is obfuscated to guess when the Go or garble versions were changed across a series of builds.

To always use a different seed for each build, use -seed=random. Note that extra care should be taken when using custom seeds: if a -seed value used in a build is lost, garble reverse will not work.

Caveats

Most of these can improve with time and effort. The purpose of this section is to document the current shortcomings of this tool.

  • Exported methods are never obfuscated at the moment, since they could be required by interfaces. This area is a work in progress; see #3.

  • Garble automatically detects which Go types are used with reflection to avoid obfuscating them, as that might break your program. Note that Garble obfuscates one package at a time, so if your reflection code inspects a type from an imported package, you may need to add a "hint" in the imported package to exclude obfuscating it:

    type Message struct {
        Command string
        Args    string
    }
    
    // Never obfuscate the Message type.
    var _ = reflect.TypeOf(Message{})
  • Aside from GOGARBLE to select patterns of packages to obfuscate, and the hint above with reflect.TypeOf to exclude obfuscating particular types, there is no supported way to exclude obfuscating a selection of files or packages. More often than not, a user would want to do this to work around a bug; please file the bug instead.

  • Go programs are initialized one package at a time, where imported packages are always initialized before their importers, and otherwise they are initialized in the lexical order of their import paths. Since garble obfuscates import paths, this lexical order may change arbitrarily.

  • Go plugins are not currently supported; see #87.

  • Garble requires git to patch the linker. That can be avoided once go-gitdiff supports non-strict patches.

Contributing

We welcome new contributors. If you would like to contribute, see CONTRIBUTING.md as a starting point.

garble's People

Contributors

azrotronik avatar capnspacehook avatar chee-zaram avatar dlespiau avatar dominicbreuker avatar hasheddan avatar hritik14 avatar kortschak avatar lu4p avatar mrs4s avatar mvdan avatar nick-jones avatar pagran avatar shellhazard avatar sig1nt avatar xuannv112 avatar zwass avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

garble's Issues

Ability to show how the source code gets garbled

Perhaps a unified or side-by-side diff on a per-file basis.

This needs careful thought. Simply sending both lines to /bin/diff would produce a ton of noise, and probably not provide the user with enough context.

SIGSEGV During Build

Unfortunately I cannot provide the source, but below is the stacktrace:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x126338f]

goroutine 1 [running]:
go/types.(*Package).Path(...)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/types/package.go:30
main.buildBlacklist.func2(0x1358ee0, 0xc000186080, 0x1359401)
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:504 +0xef
go/ast.inspector.Visit(0xc00054eab0, 0x1358ee0, 0xc000186080, 0x1358200, 0xc00054eab0)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:373 +0x3a
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358ee0, 0xc000186080)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:52 +0x66
go/ast.walkExprList(0x1358200, 0xc00054eab0, 0xc000182630, 0x1, 0x1)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:26 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358ce0, 0xc0001860c0)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:207 +0x2112
go/ast.walkStmtList(0x1358200, 0xc00054eab0, 0xc000182640, 0x1, 0x1)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:32 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358e60, 0xc000165e00)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:224 +0x1b76
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1359460, 0xc000186100)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:231 +0x1c82
go/ast.walkStmtList(0x1358200, 0xc00054eab0, 0xc00013ec00, 0x13, 0x20)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:32 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358e60, 0xc000188030)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:224 +0x1b76
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1359320, 0xc0001827d0)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:98 +0x2c19
go/ast.walkExprList(0x1358200, 0xc00054eab0, 0xc0001863c0, 0x3, 0x4)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:26 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358ee0, 0xc000186400)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:137 +0x1089
go/ast.walkExprList(0x1358200, 0xc00054eab0, 0xc0001827e0, 0x1, 0x1)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:26 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358ce0, 0xc000186440)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:207 +0x2112
go/ast.walkStmtList(0x1358200, 0xc00054eab0, 0xc0000a9000, 0xe, 0x10)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:32 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358e60, 0xc0001882d0)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:224 +0x1b76
go/ast.Walk(0x1358200, 0xc00054eab0, 0x13596e0, 0xc000172b90)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:285 +0x2967
go/ast.walkStmtList(0x1358200, 0xc00054eab0, 0xc0000a9100, 0x9, 0x10)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:32 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1358e60, 0xc0001884e0)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:224 +0x1b76
go/ast.Walk(0x1358200, 0xc00054eab0, 0x13592e0, 0xc000188510)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:344 +0xd82
go/ast.walkDeclList(0x1358200, 0xc00054eab0, 0xc0000a9400, 0x9, 0x10)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:38 +0x9e
go/ast.Walk(0x1358200, 0xc00054eab0, 0x1359260, 0xc0000a7580)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:353 +0x2662
go/ast.Inspect(...)
	/usr/local/Cellar/go/1.13.4/libexec/src/go/ast/walk.go:385
main.buildBlacklist(0xc0000a7c80, 0x9, 0x10, 0xc00019ac30, 0xc00019acd0, 0xc00008c840)
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:510 +0x13e
main.transformCompile(0xc00000a3e0, 0x1b, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0)
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:324 +0x714
main.mainErr(0xc00000a3d0, 0x1c, 0x1d, 0x0, 0x0)
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:218 +0xb6a
main.main1(0xc000070058)
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:137 +0xda
main.main()
	/Users/zwass/dev/go/pkg/mod/mvdan.cc/[email protected]/main.go:53 +0x22
exit status 2

reflect.TypeOf() detection/blacklist is broken if -literals is passed

Somehow

garble -literals -debugdir=debug build

leads to this

// Make sure API is never garbled.
var _ = reflect.TypeOf(API(0))

being obfuscated to this although it should be blacklisted from obfuscation

// Make sure API is never garbled.
var _ = reflect.TypeOf(ZsDGTHor_(0))

Builds without -literals properly blacklist the API type from being obfuscated.

Garble filenames

Right now, we garble the source code within filenames in each package, but not the filenames themselves.

We could join all the source into a single all.go file, so that one can't get any context or meaning from the original file structure or naming.

Implement logic to garble exported struct fields

I was thinking we could implement 3 main strategies when dealing with exported struct fields. First, a flag could be introduced that when set will garble all exported struct fields. This would be helpful if the user knows that the input code does not need exported struct fields unchanged. Additionally, we could have a second flag that will only garble exported struct fields that do not have a struct tag, or maybe have struct tags that do/do not contain certain substrings (ie json:). This could be set as the safe default. Finally, a third flag could be created that when set will never garble any exported struct tags. This would be useful when the other two options break a user's code, and would be a last resort option.

I believe that giving the user some control over what gets garbled can help to overcome the difficulty of statically determining if exported struct fields can be safely renamed or not.

Allow providing a deterministic build seed or salt via a flag

I would like to add a -random flag which favors better obfuscation at the cost of reproducibility.

  • This would seed math/rand with an int64 derived from crypto/rand.
  • Furthermore the salt for hashing of the identifieres would also be generated from the seeded math/rand

Also obfuscate dependencies

Currently only the files which belong to the same module are obfuscated.
Add a flag like -deps to also obfuscate all non stdlib (stdlib is probably to expensive to obfuscate) dependencies.
I don't know how we would deal with exported identifiers of dependencies, probably leave them like they are at first.

Problem with RPC: Add abilty to exclude certain types/ methods

When I garble the ToRat client, compiling works even with cgo (many thanks).
However I communicate over RPC with the server and the server needs the API function names to stay the same.

I get the following error when a garbled client connects:
"Invalid Hostname rpc: can't find service API.Hostname"

Client RPC Api definition: https://github.com/lu4p/ToRat/blob/master/torat_client/rpcapi.go
Example Server RPC Call: https://github.com/lu4p/ToRat/blob/c23e742bc5937c40320bf437479cd7083c83e78d/torat_server/shell.go#L199

Any Ideas on how certain types and their methods could be excluded?

Explore named imports

It still seems to be a long time until #13 lands. We can probably get some of the benefits from import obfuscation by converting all imports to named imports

import "fmt"

becomes

import igxthdt "fmt"

Then fmt can be used like this:

igxthdt.Println("x")

"Obfuscated" binaries leak to much information

I analyzed a garbled binary using redress https://github.com/goretk/redress

I found that apart from the Compiler information everything else can still be extracted from the binary.

redress -compiler -interface -filepath -src -pkg -unknown -std -struct -vendor shred >> redress.txt

Output:

Error when extracting compiler information: no goversion found
type error interface {
	Error() string
}

type interface {} interface{}

type map.bucket[*reflect.structType]bool struct{
	topbits [8]uint8
	keys [8]*reflect.structType
	elems [8]bool
	overflow *<nil>
}

type map.bucket[*reflect.structType]int struct{
	topbits [8]uint8
	keys [8]*reflect.structType
	elems [8]int
	overflow *<nil>
}

type map.bucket[*uint8][]uint8 struct{
	topbits [8]uint8
	keys [8]*uint8
	elems [8][]uint8
	overflow *<nil>
}

type map.bucket[int32]unsafe.Pointer struct{
	topbits [8]uint8
	keys [8]int32
	elems [8]unsafe.Pointer
	overflow *<nil>
}

type map.bucket[interface {}]*sync.entry struct{
	topbits [8]uint8
	keys [8]interface {}
	elems [8]*sync.entry
	overflow *<nil>
}

type map.bucket[runtime._typePair]struct {} struct{
	topbits [8]uint8
	keys [8]runtime._typePair
	elems [8]struct {}
	overflow *<nil>
}

type map.bucket[runtime.typeOff]*runtime._type struct{
	topbits [8]uint8
	keys [8]int32
	elems [8]*runtime._type
	overflow *<nil>
}

type map.bucket[string]*unicode.RangeTable struct{
	topbits [8]uint8
	keys [8]string
	elems [8]*unicode.RangeTable
	overflow *<nil>
}

type map.bucket[string]int struct{
	topbits [8]uint8
	keys [8]string
	elems [8]int
	overflow *<nil>
}

type map.bucket[string]int64 struct{
	topbits [8]uint8
	keys [8]string
	elems [8]int64
	overflow *<nil>
}

type map.bucket[string]uint64 struct{
	topbits [8]uint8
	keys [8]string
	elems [8]uint64
	overflow *<nil>
}

type map.bucket[uint32][]*runtime._type struct{
	topbits [8]uint8
	keys [8]uint32
	elems [8][]*runtime._type
	overflow *<nil>
}

type map.bucket[unsafe.Pointer]int32 struct{
	topbits [8]uint8
	keys [8]unsafe.Pointer
	elems [8]int32
	overflow *<nil>
}

type map.hdr[interface {}]*sync.entry struct{
	count int
	flags uint8
	B uint8
	noverflow uint16
	hash0 uint32
	buckets *map.bucket[interface {}]*sync.entry
	oldbuckets *map.bucket[interface {}]*sync.entry
	nevacuate uintptr
	extra unsafe.Pointer
}

type struct {} struct{}

type bufio.Reader struct{
	buf []uint8
	rd io.Reader
	r int
	w int
	err error
	lastByte int
	lastRuneSize int
}

type rand.devReader struct{
	name string
	f io.Reader
	mu sync.Mutex
	used int32
}

type rand.hideAgainReader struct{
	r io.Reader
}

type errors.errorString struct{
	s string
}

type fmt.Formatter interface {
	Format(fmt.State, int32)
}

type fmt.GoStringer interface {
	GoString() string
}

type fmt.State interface {
	Flag(int) bool
	Precision() (int, bool)
	Width() (int, bool)
	Write([]uint8) (int, error)
}

type fmt.Stringer interface {
	String() string
}

type fmt.fmt struct{
	buf *[]uint8
	fmt.fmtFlags
	wid int
	prec int
	intbuf [68]uint8
}

type fmt.fmtFlags struct{
	widPresent bool
	precPresent bool
	minus bool
	plus bool
	sharp bool
	space bool
	zero bool
	plusV bool
	sharpV bool
}

type fmt.pp struct{
	buf []uint8
	arg interface {}
	value reflect.Value
	fmt fmt.fmt
	reordered bool
	goodArgNum bool
	panicking bool
	erroring bool
	wrapErrs bool
	wrappedErr error
}

type cpu.CacheLinePad struct{
	_ [64]uint8
}

type cpu.arm struct{
	_ cpu.CacheLinePad
	HasVFPv4 bool
	HasIDIVA bool
	_ cpu.CacheLinePad
}

type cpu.arm64 struct{
	_ cpu.CacheLinePad
	HasFP bool
	HasASIMD bool
	HasEVTSTRM bool
	HasAES bool
	HasPMULL bool
	HasSHA1 bool
	HasSHA2 bool
	HasCRC32 bool
	HasATOMICS bool
	HasFPHP bool
	HasASIMDHP bool
	HasCPUID bool
	HasASIMDRDM bool
	HasJSCVT bool
	HasFCMA bool
	HasLRCPC bool
	HasDCPOP bool
	HasSHA3 bool
	HasSM3 bool
	HasSM4 bool
	HasASIMDDP bool
	HasSHA512 bool
	HasSVE bool
	HasASIMDFHM bool
	_ cpu.CacheLinePad
}

type cpu.option struct{
	Name string
	Feature *bool
	Specified bool
	Enable bool
	Required bool
}

type cpu.x86 struct{
	_ cpu.CacheLinePad
	HasAES bool
	HasADX bool
	HasAVX bool
	HasAVX2 bool
	HasBMI1 bool
	HasBMI2 bool
	HasERMS bool
	HasFMA bool
	HasOSXSAVE bool
	HasPCLMULQDQ bool
	HasPOPCNT bool
	HasSSE2 bool
	HasSSE3 bool
	HasSSSE3 bool
	HasSSE41 bool
	HasSSE42 bool
	_ cpu.CacheLinePad
}

type fmtsort.SortedMap struct{
	Key []reflect.Value
	Value []reflect.Value
}

type poll.FD struct{
	fdmu poll.fdMutex
	Sysfd int
	pd poll.pollDesc
	iovecs *[]syscall.Iovec
	csema uint32
	isBlocking uint32
	IsStream bool
	ZeroReadIsEOF bool
	isFile bool
}

type poll.TimeoutError struct{}

type poll.fdMutex struct{
	state uint64
	rsema uint32
	wsema uint32
}

type poll.pollDesc struct{
	runtimeCtx uintptr
}

type reflectlite.Type interface {
	AssignableTo(reflectlite.Type) bool
	Comparable() bool
	Elem() reflectlite.Type
	Implements(reflectlite.Type) bool
	Kind() uint
	Name() string
	PkgPath() string
	Size() uintptr
	String() string
	common() *reflectlite.rtype
	uncommon() *reflectlite.uncommonType
}

type reflectlite.rtype struct{
	size uintptr
	ptrdata uintptr
	hash uint32
	tflag uint8
	align uint8
	fieldAlign uint8
	kind uint8
	equal func(unsafe.Pointer, unsafe.Pointer) bool
	gcdata *uint8
	str int32
	ptrToThis int32
}

type reflectlite.uncommonType struct{
	pkgPath int32
	mcount uint16
	xcount uint16
	moff uint32
	_ uint32
}

type testlog.Interface interface {
	Chdir(string)
	Getenv(string)
	Open(string)
	Stat(string)
}

type io.Reader interface {
	Read([]uint8) (int, error)
}

type io.Writer interface {
	Write([]uint8) (int, error)
}

type log.Logger struct{
	mu sync.Mutex
	prefix string
	flag int
	out io.Writer
	buf []uint8
}

type big.ErrNaN struct{
	msg string
}

type big.Float struct{
	prec uint32
	mode uint8
	acc int8
	form uint8
	neg bool
	mant []uint
	exp int32
}

type big.Int struct{
	neg bool
	abs []uint
}

type big.decimal struct{
	mant []uint8
	exp int
}

type big.divisor struct{
	bbb []uint
	nbits int
	ndigits int
}

type struct { sync.Mutex; table [64]big.divisor } struct{
	sync.Mutex
	table [64]big.divisor
}

type rand.Rand struct{
	src rand.Source
	s64 rand.Source64
	readVal int64
	readPos int8
}

type rand.Source interface {
	Int63() int64
	Seed(int64)
}

type rand.Source64 interface {
	Int63() int64
	Seed(int64)
	Uint64() uint64
}

type rand.lockedSource struct{
	lk sync.Mutex
	src *rand.rngSource
}

type rand.rngSource struct{
	tap int
	feed int
	vec [607]int64
}

type os.File struct{
	*os.file
}

type os.FileInfo interface {
	IsDir() bool
	ModTime() time.Time
	Mode() uint32
	Name() string
	Size() int64
	Sys() interface {}
}

type os.PathError struct{
	Op string
	Path string
	Err error
}

type os.SyscallError struct{
	Syscall string
	Err error
}

type os.dirInfo struct{
	buf []uint8
	nbuf int
	bufp int
}

type os.file struct{
	pfd poll.FD
	name string
	dirinfo *os.dirInfo
	nonblock bool
	stdoutOrErr bool
	appendMode bool
}

type os.fileStat struct{
	name string
	size int64
	mode uint32
	modTime time.Time
	sys syscall.Stat_t
}

type filepath.lazybuf struct{
	path string
	buf []uint8
	w int
	volAndPath string
	volLen int
}

type reflect.MapIter struct{
	m reflect.Value
	it unsafe.Pointer
}

type reflect.Method struct{
	Name string
	PkgPath string
	Type reflect.Type
	Func reflect.Value
	Index int
}

type reflect.StructField struct{
	Name string
	PkgPath string
	Type reflect.Type
	Tag string
	Offset uintptr
	Index []int
	Anonymous bool
}

type reflect.Type interface {
	Align() int
	AssignableTo(reflect.Type) bool
	Bits() int
	ChanDir() int
	Comparable() bool
	ConvertibleTo(reflect.Type) bool
	Elem() reflect.Type
	Field(int) reflect.StructField
	FieldAlign() int
	FieldByIndex([]int) reflect.StructField
	FieldByName(string) (reflect.StructField, bool)
	FieldByNameFunc(func(string) bool) (reflect.StructField, bool)
	Implements(reflect.Type) bool
	In(int) reflect.Type
	IsVariadic() bool
	Key() reflect.Type
	Kind() uint
	Len() int
	Method(int) reflect.Method
	MethodByName(string) (reflect.Method, bool)
	Name() string
	NumField() int
	NumIn() int
	NumMethod() int
	NumOut() int
	Out(int) reflect.Type
	PkgPath() string
	Size() uintptr
	String() string
	common() *reflect.rtype
	uncommon() *reflect.uncommonType
}

type reflect.Value struct{
	typ *reflect.rtype
	ptr unsafe.Pointer
	uintptr
}

type reflect.ValueError struct{
	Method string
	Kind uint
}

type reflect.bitVector struct{
	n uint32
	data []uint8
}

type reflect.fieldScan struct{
	typ *reflect.structType
	index []int
}

type reflect.funcType struct{
	reflect.rtype
	inCount uint16
	outCount uint16
}

type reflect.funcTypeFixed128 struct{
	reflect.funcType
	args [128]*reflect.rtype
}

type reflect.funcTypeFixed16 struct{
	reflect.funcType
	args [16]*reflect.rtype
}

type reflect.funcTypeFixed32 struct{
	reflect.funcType
	args [32]*reflect.rtype
}

type reflect.funcTypeFixed4 struct{
	reflect.funcType
	args [4]*reflect.rtype
}

type reflect.funcTypeFixed64 struct{
	reflect.funcType
	args [64]*reflect.rtype
}

type reflect.funcTypeFixed8 struct{
	reflect.funcType
	args [8]*reflect.rtype
}

type reflect.layoutKey struct{
	ftyp *reflect.funcType
	rcvr *reflect.rtype
}

type reflect.layoutType struct{
	t *reflect.rtype
	argSize uintptr
	retOffset uintptr
	stack *reflect.bitVector
	framePool *sync.Pool
}

type reflect.methodValue struct{
	fn uintptr
	stack *reflect.bitVector
	argLen uintptr
	method int
	rcvr reflect.Value
}

type reflect.name struct{
	bytes *uint8
}

type reflect.ptrType struct{
	reflect.rtype
	elem *reflect.rtype
}

type reflect.rtype struct{
	size uintptr
	ptrdata uintptr
	hash uint32
	tflag uint8
	align uint8
	fieldAlign uint8
	kind uint8
	equal func(unsafe.Pointer, unsafe.Pointer) bool
	gcdata *uint8
	str int32
	ptrToThis int32
}

type reflect.stringHeader struct{
	Data unsafe.Pointer
	Len int
}

type reflect.structField struct{
	name reflect.name
	typ *reflect.rtype
	offsetEmbed uintptr
}

type reflect.structType struct{
	reflect.rtype
	pkgPath reflect.name
	fields []reflect.structField
}

type reflect.uncommonType struct{
	pkgPath int32
	mcount uint16
	xcount uint16
	moff uint32
	_ uint32
}

type struct { b bool; x interface {} } struct{
	b bool
	x interface {}
}

type struct { sync.Mutex; m sync.Map } struct{
	sync.Mutex
	m sync.Map
}

type runtime.Frame struct{
	PC uintptr
	Func *runtime.Func
	Function string
	File string
	Line int
	Entry uintptr
	funcInfo runtime.funcInfo
}

type runtime.Frames struct{
	callers []uintptr
	frames []runtime.Frame
	frameStore [2]runtime.Frame
}

type runtime.Func struct{
	opaque struct {}
}

type runtime.TypeAssertionError struct{
	_interface *runtime._type
	concrete *runtime._type
	asserted *runtime._type
	missingMethod string
}

type runtime._defer struct{
	siz int32
	started bool
	heap bool
	openDefer bool
	sp uintptr
	pc uintptr
	fn *runtime.funcval
	_panic *runtime._panic
	link *<nil>
	fd unsafe.Pointer
	varp uintptr
	framepc uintptr
}

type runtime._func struct{
	entry uintptr
	nameoff int32
	args int32
	deferreturn uint32
	pcsp int32
	pcfile int32
	pcln int32
	npcdata int32
	funcID uint8
	_ [2]int8
	nfuncdata uint8
}

type runtime._panic struct{
	argp unsafe.Pointer
	arg interface {}
	link *<nil>
	pc uintptr
	sp unsafe.Pointer
	recovered bool
	aborted bool
	goexit bool
}

type runtime._type struct{
	size uintptr
	ptrdata uintptr
	hash uint32
	tflag uint8
	align uint8
	fieldAlign uint8
	kind uint8
	equal func(unsafe.Pointer, unsafe.Pointer) bool
	gcdata *uint8
	str int32
	ptrToThis int32
}

type runtime._typePair struct{
	t1 *runtime._type
	t2 *runtime._type
}

type runtime.addrRange struct{
	base uintptr
	limit uintptr
}

type runtime.addrRanges struct{
	ranges []runtime.addrRange
	sysStat *uint64
}

type runtime.ancestorInfo struct{
	pcs []uintptr
	goid int64
	gopc uintptr
}

type runtime.arenaHint struct{
	addr uintptr
	down bool
	next *<nil>
}

type runtime.bitvector struct{
	n int32
	bytedata *uint8
}

type runtime.bmap struct{
	tophash [8]uint8
}

type runtime.boundsError struct{
	x int64
	y int
	signed bool
	code uint8
}

type runtime.bucket struct{
	next *<nil>
	allnext *<nil>
	typ int
	hash uintptr
	size uintptr
	nstk uintptr
}

type runtime.cgoSymbolizerArg struct{
	pc uintptr
	file *uint8
	lineno uintptr
	funcName *uint8
	entry uintptr
	more uintptr
	data uintptr
}

type runtime.cgoTracebackArg struct{
	context uintptr
	sigContext uintptr
	buf *uintptr
	max uintptr
}

type runtime.cgothreadstart struct{
	g uintptr
	tls *uint64
	fn unsafe.Pointer
}

type runtime.cpuProfile struct{
	lock runtime.mutex
	on bool
	log *runtime.profBuf
	extra [1000]uintptr
	numExtra int
	lostExtra uint64
	lostAtomic uint64
}

type runtime.dbgVar struct{
	name string
	value *int32
}

type runtime.divMagic struct{
	shift uint8
	shift2 uint8
	mul uint16
	baseMask uint16
}

type runtime.dlogPerM struct{}

type runtime.eface struct{
	_type *runtime._type
	data unsafe.Pointer
}

type runtime.elfSym struct{
	st_name uint32
	st_info uint8
	st_other uint8
	st_shndx uint16
	st_value uint64
	st_size uint64
}

type runtime.elfVerdef struct{
	vd_version uint16
	vd_flags uint16
	vd_ndx uint16
	vd_cnt uint16
	vd_hash uint32
	vd_aux uint32
	vd_next uint32
}

type runtime.evacDst struct{
	b *runtime.bmap
	i int
	k unsafe.Pointer
	e unsafe.Pointer
}

type runtime.finalizer struct{
	fn *runtime.funcval
	arg unsafe.Pointer
	nret uintptr
	fint *runtime._type
	ot *runtime.ptrtype
}

type runtime.finblock struct{
	alllink *<nil>
	next *<nil>
	cnt uint32
	_ int32
	fin [101]runtime.finalizer
}

type runtime.fixalloc struct{
	size uintptr
	first func(unsafe.Pointer, unsafe.Pointer)
	arg unsafe.Pointer
	list *runtime.mlink
	chunk uintptr
	nchunk uint32
	inuse uintptr
	stat *uint64
	zero bool
}

type runtime.forcegcstate struct{
	lock runtime.mutex
	g *runtime.g
	idle uint32
}

type runtime.funcInfo struct{
	*runtime._func
	datap *runtime.moduledata
}

type runtime.funcinl struct{
	zero uintptr
	entry uintptr
	name string
	file string
	line int
}

type runtime.functab struct{
	entry uintptr
	funcoff uintptr
}

type runtime.funcval struct{
	fn uintptr
}

type runtime.g struct{
	stack runtime.stack
	stackguard0 uintptr
	stackguard1 uintptr
	_panic *runtime._panic
	_defer *runtime._defer
	m *runtime.m
	sched runtime.gobuf
	syscallsp uintptr
	syscallpc uintptr
	stktopsp uintptr
	param unsafe.Pointer
	atomicstatus uint32
	stackLock uint32
	goid int64
	schedlink uintptr
	waitsince int64
	waitreason uint8
	preempt bool
	preemptStop bool
	preemptShrink bool
	asyncSafePoint bool
	paniconfault bool
	gcscandone bool
	throwsplit bool
	activeStackChans bool
	raceignore int8
	sysblocktraced bool
	sysexitticks int64
	traceseq uint64
	tracelastp uintptr
	lockedm uintptr
	sig uint32
	writebuf []uint8
	sigcode0 uintptr
	sigcode1 uintptr
	sigpc uintptr
	gopc uintptr
	ancestors *[]runtime.ancestorInfo
	startpc uintptr
	racectx uintptr
	waiting *runtime.sudog
	cgoCtxt []uintptr
	labels unsafe.Pointer
	timer *runtime.timer
	selectDone uint32
	gcAssistBytes int64
}

type runtime.gList struct{
	head uintptr
}

type runtime.gQueue struct{
	head uintptr
	tail uintptr
}

type runtime.gcBitsArena struct{
	free uintptr
	next *<nil>
	bits [65520]uint8
}

type runtime.gcControllerState struct{
	scanWork int64
	bgScanCredit int64
	assistTime int64
	dedicatedMarkTime int64
	fractionalMarkTime int64
	idleMarkTime int64
	markStartTime int64
	dedicatedMarkWorkersNeeded int64
	assistWorkPerByte float64
	assistBytesPerWork float64
	fractionalUtilizationGoal float64
	_ cpu.CacheLinePad
}

type runtime.gcSweepBuf struct{
	spineLock runtime.mutex
	spine unsafe.Pointer
	spineLen uintptr
	spineCap uintptr
	index uint32
}

type runtime.gcWork struct{
	wbuf1 *runtime.workbuf
	wbuf2 *runtime.workbuf
	bytesMarked uint64
	scanWork int64
	flushedWork bool
	pauseGen uint32
	putGen uint32
	pauseStack [16]uintptr
}

type runtime.gobuf struct{
	sp uintptr
	pc uintptr
	g uintptr
	ctxt unsafe.Pointer
	ret uint64
	lr uintptr
	bp uintptr
}

type runtime.gsignalStack struct{
	stack runtime.stack
	stackguard0 uintptr
	stackguard1 uintptr
	stktopsp uintptr
}

type runtime.hchan struct{
	qcount uint
	dataqsiz uint
	buf unsafe.Pointer
	elemsize uint16
	closed uint32
	elemtype *runtime._type
	sendx uint
	recvx uint
	recvq runtime.waitq
	sendq runtime.waitq
	lock runtime.mutex
}

type runtime.heapArena struct{
	bitmap [2097152]uint8
	spans [8192]*runtime.mspan
	pageInUse [1024]uint8
	pageMarks [1024]uint8
	zeroedBase uintptr
}

type runtime.hiter struct{
	key unsafe.Pointer
	elem unsafe.Pointer
	t *runtime.maptype
	h *runtime.hmap
	buckets unsafe.Pointer
	bptr *runtime.bmap
	overflow *[]*runtime.bmap
	oldoverflow *[]*runtime.bmap
	startBucket uintptr
	offset uint8
	wrapped bool
	B uint8
	i uint8
	bucket uintptr
	checkBucket uintptr
}

type runtime.hmap struct{
	count int
	flags uint8
	B uint8
	noverflow uint16
	hash0 uint32
	buckets unsafe.Pointer
	oldbuckets unsafe.Pointer
	nevacuate uintptr
	extra *runtime.mapextra
}

type runtime.imethod struct{
	name int32
	ityp int32
}

type runtime.initTask struct{
	state uintptr
	ndeps uintptr
	nfns uintptr
}

type runtime.interfacetype struct{
	typ runtime._type
	pkgpath runtime.name
	mhdr []runtime.imethod
}

type runtime.itab struct{
	inter *runtime.interfacetype
	_type *runtime._type
	hash uint32
	_ [4]uint8
	fun [1]uintptr
}

type runtime.itabTableType struct{
	size uintptr
	count uintptr
	entries [512]*runtime.itab
}

type runtime.lfnode struct{
	next uint64
	pushcnt uintptr
}

type runtime.libcall struct{
	fn uintptr
	n uintptr
	args uintptr
	r1 uintptr
	r2 uintptr
	err uintptr
}

type runtime.linearAlloc struct{
	next uintptr
	mapped uintptr
	end uintptr
}

type runtime.m struct{
	g0 *<nil>
	morebuf runtime.gobuf
	divmod uint32
	procid uint64
	gsignal *<nil>
	goSigStack runtime.gsignalStack
	sigmask [2]uint32
	tls [6]uintptr
	mstartfn func()
	curg *<nil>
	caughtsig uintptr
	p uintptr
	nextp uintptr
	oldp uintptr
	id int64
	mallocing int32
	throwing int32
	preemptoff string
	locks int32
	dying int32
	profilehz int32
	spinning bool
	blocked bool
	newSigstack bool
	printlock int8
	incgo bool
	freeWait uint32
	fastrand [2]uint32
	needextram bool
	traceback uint8
	ncgocall uint64
	ncgo int32
	cgoCallersUse uint32
	cgoCallers *[32]uintptr
	park runtime.note
	alllink *<nil>
	schedlink uintptr
	mcache *runtime.mcache
	lockedg uintptr
	createstack [32]uintptr
	lockedExt uint32
	lockedInt uint32
	nextwaitm uintptr
	waitunlockf func(*runtime.g, unsafe.Pointer) bool
	waitlock unsafe.Pointer
	waittraceev uint8
	waittraceskip int
	startingtrace bool
	syscalltick uint32
	freelink *<nil>
	libcall runtime.libcall
	libcallpc uintptr
	libcallsp uintptr
	libcallg uintptr
	syscall runtime.libcall
	vdsoSP uintptr
	vdsoPC uintptr
	preemptGen uint32
	runtime.dlogPerM
	runtime.mOS
}

type runtime.mOS struct{}

type runtime.mSpanList struct{
	first *<nil>
	last *<nil>
}

type runtime.mSpanStateBox struct{
	s uint8
}

type runtime.mapextra struct{
	overflow *[]*runtime.bmap
	oldoverflow *[]*runtime.bmap
	nextOverflow *runtime.bmap
}

type runtime.maptype struct{
	typ runtime._type
	key *runtime._type
	elem *runtime._type
	bucket *runtime._type
	hasher func(unsafe.Pointer, uintptr) uintptr
	keysize uint8
	elemsize uint8
	bucketsize uint16
	flags uint32
}

type runtime.markBits struct{
	bytep *uint8
	mask uint8
	index uintptr
}

type runtime.mcache struct{
	next_sample uintptr
	local_scan uintptr
	tiny uintptr
	tinyoffset uintptr
	local_tinyallocs uintptr
	alloc [134]*runtime.mspan
	stackcache [4]runtime.stackfreelist
	local_largefree uintptr
	local_nlargefree uintptr
	local_nsmallfree [67]uintptr
	flushGen uint32
}

type runtime.mcentral struct{
	lock runtime.mutex
	spanclass uint8
	nonempty runtime.mSpanList
	empty runtime.mSpanList
	nmalloc uint64
}

type runtime.mheap struct{
	lock runtime.mutex
	pages runtime.pageAlloc
	sweepgen uint32
	sweepdone uint32
	sweepers uint32
	allspans []*runtime.mspan
	sweepSpans [2]runtime.gcSweepBuf
	pagesInUse uint64
	pagesSwept uint64
	pagesSweptBasis uint64
	sweepHeapLiveBasis uint64
	sweepPagesPerByte float64
	scavengeGoal uint64
	reclaimIndex uint64
	reclaimCredit uintptr
	largealloc uint64
	nlargealloc uint64
	largefree uint64
	nlargefree uint64
	nsmallfree [67]uint64
	arenas [1]*[4194304]*runtime.heapArena
	heapArenaAlloc runtime.linearAlloc
	arenaHints *runtime.arenaHint
	arena runtime.linearAlloc
	allArenas []uint
	sweepArenas []uint
	curArena struct { base uintptr; end uintptr }
	_ uint32
	central [134]struct { mcentral runtime.mcentral; pad [8]uint8 }
	spanalloc runtime.fixalloc
	cachealloc runtime.fixalloc
	specialfinalizeralloc runtime.fixalloc
	specialprofilealloc runtime.fixalloc
	speciallock runtime.mutex
	arenaHintAlloc runtime.fixalloc
	unused *runtime.specialfinalizer
}

type runtime.mlink struct{
	next *<nil>
}

type runtime.moduledata struct{
	pclntable []uint8
	ftab []runtime.functab
	filetab []uint32
	findfunctab uintptr
	minpc uintptr
	maxpc uintptr
	text uintptr
	etext uintptr
	noptrdata uintptr
	enoptrdata uintptr
	data uintptr
	edata uintptr
	bss uintptr
	ebss uintptr
	noptrbss uintptr
	enoptrbss uintptr
	end uintptr
	gcdata uintptr
	gcbss uintptr
	types uintptr
	etypes uintptr
	textsectmap []runtime.textsect
	typelinks []int32
	itablinks []*runtime.itab
	ptab []runtime.ptabEntry
	pluginpath string
	pkghashes []runtime.modulehash
	modulename string
	modulehashes []runtime.modulehash
	hasmain uint8
	gcdatamask runtime.bitvector
	gcbssmask runtime.bitvector
	typemap map[int32]*runtime._type
	bad bool
	next *<nil>
}

type runtime.modulehash struct{
	modulename string
	linktimehash string
	runtimehash *string
}

type runtime.mspan struct{
	next *<nil>
	prev *<nil>
	list *runtime.mSpanList
	startAddr uintptr
	npages uintptr
	manualFreeList uintptr
	freeindex uintptr
	nelems uintptr
	allocCache uint64
	allocBits *uint8
	gcmarkBits *uint8
	sweepgen uint32
	divMul uint16
	baseMask uint16
	allocCount uint16
	spanclass uint8
	state runtime.mSpanStateBox
	needzero uint8
	divShift uint8
	divShift2 uint8
	elemsize uintptr
	limit uintptr
	speciallock runtime.mutex
	specials *runtime.special
}

type runtime.mstats struct{
	alloc uint64
	total_alloc uint64
	sys uint64
	nlookup uint64
	nmalloc uint64
	nfree uint64
	heap_alloc uint64
	heap_sys uint64
	heap_idle uint64
	heap_inuse uint64
	heap_released uint64
	heap_objects uint64
	stacks_inuse uint64
	stacks_sys uint64
	mspan_inuse uint64
	mspan_sys uint64
	mcache_inuse uint64
	mcache_sys uint64
	buckhash_sys uint64
	gc_sys uint64
	other_sys uint64
	next_gc uint64
	last_gc_unix uint64
	pause_total_ns uint64
	pause_ns [256]uint64
	pause_end [256]uint64
	numgc uint32
	numforcedgc uint32
	gc_cpu_fraction float64
	enablegc bool
	debuggc bool
	by_size [67]struct { size uint32; nmalloc uint64; nfree uint64 }
	last_gc_nanotime uint64
	tinyallocs uint64
	last_next_gc uint64
	last_heap_inuse uint64
	triggerRatio float64
	gc_trigger uint64
	heap_live uint64
	heap_scan uint64
	heap_marked uint64
}

type runtime.mutex struct{
	key uintptr
}

type runtime.name struct{
	bytes *uint8
}

type runtime.notInHeap struct{}

type runtime.notInHeapSlice struct{
	array *runtime.notInHeap
	len int
	cap int
}

type runtime.note struct{
	key uintptr
}

type runtime.p struct{
	id int32
	status uint32
	link uintptr
	schedtick uint32
	syscalltick uint32
	sysmontick runtime.sysmontick
	m uintptr
	mcache *runtime.mcache
	pcache runtime.pageCache
	raceprocctx uintptr
	deferpool [5][]*runtime._defer
	deferpoolbuf [5][32]*runtime._defer
	goidcache uint64
	goidcacheend uint64
	runqhead uint32
	runqtail uint32
	runq [256]uintptr
	runnext uintptr
	gFree struct { runtime.gList; n int32 }
	sudogcache []*runtime.sudog
	sudogbuf [128]*runtime.sudog
	mspancache struct { len int; buf [128]*runtime.mspan }
	tracebuf uintptr
	traceSweep bool
	traceSwept uintptr
	traceReclaimed uintptr
	palloc runtime.persistentAlloc
	_ uint32
	timer0When uint64
	gcAssistTime int64
	gcFractionalMarkTime int64
	gcBgMarkWorker uintptr
	gcMarkWorkerMode int
	gcMarkWorkerStartTime int64
	gcw runtime.gcWork
	wbBuf runtime.wbBuf
	runSafePointFn uint32
	timersLock runtime.mutex
	timers []*runtime.timer
	numTimers uint32
	adjustTimers uint32
	deletedTimers uint32
	timerRaceCtx uintptr
	preempt bool
	pad cpu.CacheLinePad
}

type runtime.pageAlloc struct{
	summary [5][]uint64
	chunks [8192]*[8192]runtime.pallocData
	searchAddr uintptr
	scavAddr uintptr
	scavReleased uintptr
	start uint
	end uint
	inUse runtime.addrRanges
	mheapLock *runtime.mutex
	sysStat *uint64
	test bool
}

type runtime.pageCache struct{
	base uintptr
	cache uint64
	scav uint64
}

type runtime.pallocData struct{
	[8]uint64
	scavenged [8]uint64
}

type runtime.parkInfo struct{
	m uintptr
	attach uintptr
}

type runtime.pcvalueCache struct{
	entries [2][8]runtime.pcvalueCacheEnt
}

type runtime.pcvalueCacheEnt struct{
	targetpc uintptr
	off int32
	val int32
}

type runtime.persistentAlloc struct{
	base *runtime.notInHeap
	off uintptr
}

type runtime.pollCache struct{
	lock runtime.mutex
	first *runtime.pollDesc
}

type runtime.pollDesc struct{
	link *<nil>
	lock runtime.mutex
	fd uintptr
	closing bool
	everr bool
	user uint32
	rseq uintptr
	rg uintptr
	rt runtime.timer
	rd int64
	wseq uintptr
	wg uintptr
	wt runtime.timer
	wd int64
}

type runtime.profBuf struct{
	r uint64
	w uint64
	overflow uint64
	overflowTime uint64
	eof uint32
	hdrsize uintptr
	data []uint64
	tags []unsafe.Pointer
	rNext uint64
	overflowBuf []uint64
	wait runtime.note
}

type runtime.ptabEntry struct{
	name int32
	typ int32
}

type runtime.ptrtype struct{
	typ runtime._type
	elem *runtime._type
}

type runtime.randomOrder struct{
	count uint32
	coprimes []uint32
}

type runtime.rwmutex struct{
	rLock runtime.mutex
	readers uintptr
	readerPass uint32
	wLock runtime.mutex
	writer uintptr
	readerCount uint32
	readerWait uint32
}

type runtime.schedt struct{
	goidgen uint64
	lastpoll uint64
	pollUntil uint64
	lock runtime.mutex
	midle uintptr
	nmidle int32
	nmidlelocked int32
	mnext int64
	maxmcount int32
	nmsys int32
	nmfreed int64
	ngsys uint32
	pidle uintptr
	npidle uint32
	nmspinning uint32
	runq runtime.gQueue
	runqsize int32
	disable struct { user bool; runnable runtime.gQueue; n int32 }
	gFree struct { lock runtime.mutex; stack runtime.gList; noStack runtime.gList; n int32 }
	sudoglock runtime.mutex
	sudogcache *runtime.sudog
	deferlock runtime.mutex
	deferpool [5]*runtime._defer
	freem *runtime.m
	gcwaiting uint32
	stopwait int32
	stopnote runtime.note
	sysmonwait uint32
	sysmonnote runtime.note
	safePointFn func(*runtime.p)
	safePointWait int32
	safePointNote runtime.note
	profilehz int32
	procresizetime int64
	totaltime int64
}

type runtime.semaRoot struct{
	lock runtime.mutex
	treap *runtime.sudog
	nwait uint32
}

type runtime.sigTabT struct{
	flags int32
	name string
}

type runtime.sigactiont struct{
	sa_handler uintptr
	sa_flags uint64
	sa_restorer uintptr
	sa_mask uint64
}

type runtime.sigctxt struct{
	info *runtime.siginfo
	ctxt unsafe.Pointer
}

type runtime.siginfo struct{
	si_signo int32
	si_errno int32
	si_code int32
	si_addr uint64
}

type runtime.special struct{
	next *<nil>
	offset uint16
	kind uint8
}

type runtime.specialfinalizer struct{
	special runtime.special
	fn *runtime.funcval
	nret uintptr
	fint *runtime._type
	ot *runtime.ptrtype
}

type runtime.stack struct{
	lo uintptr
	hi uintptr
}

type runtime.stackObject struct{
	off uint32
	size uint32
	typ *runtime._type
	left *<nil>
	right *<nil>
}

type runtime.stackObjectBuf struct{
	runtime.stackObjectBufHdr
	obj [63]runtime.stackObject
}

type runtime.stackObjectBufHdr struct{
	runtime.workbufhdr
	next *<nil>
}

type runtime.stackObjectRecord struct{
	off int
	typ *runtime._type
}

type runtime.stackScanState struct{
	cache runtime.pcvalueCache
	stack runtime.stack
	conservative bool
	buf *runtime.stackWorkBuf
	freeBuf *runtime.stackWorkBuf
	cbuf *runtime.stackWorkBuf
	head *runtime.stackObjectBuf
	tail *runtime.stackObjectBuf
	nobjs int
	root *runtime.stackObject
}

type runtime.stackWorkBuf struct{
	runtime.stackWorkBufHdr
	obj [252]uintptr
}

type runtime.stackWorkBufHdr struct{
	runtime.workbufhdr
	next *<nil>
}

type runtime.stackfreelist struct{
	list uintptr
	size uintptr
}

type runtime.stackpoolItem struct{
	mu runtime.mutex
	span runtime.mSpanList
}

type runtime.stackt struct{
	ss_sp *uint8
	ss_flags int32
	pad_cgo_0 [4]uint8
	ss_size uintptr
}

type runtime.stkframe struct{
	fn runtime.funcInfo
	pc uintptr
	continpc uintptr
	lr uintptr
	sp uintptr
	fp uintptr
	varp uintptr
	argp uintptr
	arglen uintptr
	argmap *runtime.bitvector
}

type runtime.stringStruct struct{
	str unsafe.Pointer
	len int
}

type runtime.stringer interface {
	String() string
}

type runtime.structfield struct{
	name runtime.name
	typ *runtime._type
	offsetAnon uintptr
}

type runtime.sudog struct{
	g *<nil>
	isSelect bool
	next *<nil>
	prev *<nil>
	elem unsafe.Pointer
	acquiretime int64
	releasetime int64
	ticket uint32
	parent *<nil>
	waitlink *<nil>
	waittail *<nil>
	c *runtime.hchan
}

type runtime.sweepdata struct{
	lock runtime.mutex
	g *runtime.g
	parked bool
	started bool
	nbgsweep uint32
	npausesweep uint32
}

type runtime.sysmontick struct{
	schedtick uint32
	schedwhen int64
	syscalltick uint32
	syscallwhen int64
}

type runtime.textsect struct{
	vaddr uintptr
	length uintptr
	baseaddr uintptr
}

type runtime.timer struct{
	pp uintptr
	when int64
	period int64
	f func(interface {}, uintptr)
	arg interface {}
	seq uintptr
	nextwhen int64
	status uint32
}

type runtime.traceAlloc struct{
	head uintptr
	off uintptr
}

type runtime.traceStackTable struct{
	lock runtime.mutex
	seq uint32
	mem runtime.traceAlloc
	tab [8192]uintptr
}

type runtime.vdsoInfo struct{
	valid bool
	loadAddr uintptr
	loadOffset uintptr
	symtab *[46912496118442]runtime.elfSym
	symstrings *[1125899906842623]uint8
	chain []uint32
	bucket []uint32
	symOff uint32
	isGNUHash bool
	versym *[562949953421311]uint16
	verdef *runtime.elfVerdef
}

type runtime.vdsoSymbolKey struct{
	name string
	symHash uint32
	gnuHash uint32
	ptr *uintptr
}

type runtime.vdsoVersionKey struct{
	version string
	verHash uint32
}

type runtime.waitq struct{
	first *<nil>
	last *<nil>
}

type runtime.wbBuf struct{
	next uintptr
	end uintptr
	buf [512]uintptr
	debugGen uint32
}

type runtime.workbuf struct{
	runtime.workbufhdr
	obj [253]uintptr
}

type runtime.workbufhdr struct{
	node runtime.lfnode
	nobj int
}

type struct { allocfreetrace int32; cgocheck int32; clobberfree int32; efence int32; gccheckmark int32; gcpacertrace int32; gcshrinkstackoff int32; gcstoptheworld int32; gctrace int32; invalidptr int32; madvdontneed int32; sbrk int32; scavenge int32; scavtrace int32; scheddetail int32; schedtrace int32; tracebackancestors int32; asyncpreemptoff int32 } struct{
	allocfreetrace int32
	cgocheck int32
	clobberfree int32
	efence int32
	gccheckmark int32
	gcpacertrace int32
	gcshrinkstackoff int32
	gcstoptheworld int32
	gctrace int32
	invalidptr int32
	madvdontneed int32
	sbrk int32
	scavenge int32
	scavtrace int32
	scheddetail int32
	schedtrace int32
	tracebackancestors int32
	asyncpreemptoff int32
}

type struct { base uintptr; bound uintptr } struct{
	base uintptr
	bound uintptr
}

type struct { base uintptr; end uintptr } struct{
	base uintptr
	end uintptr
}

type struct { cycle uint32; flushed bool } struct{
	cycle uint32
	flushed bool
}

type struct { enabled bool; pad [3]uint8; needed bool; cgo bool; alignme uint64 } struct{
	enabled bool
	pad [3]uint8
	needed bool
	cgo bool
	alignme uint64
}

type struct { full runtime.lfstack; empty runtime.lfstack; pad0 cpu.CacheLinePad; wbufSpans struct { lock runtime.mutex; free runtime.mSpanList; busy runtime.mSpanList }; _ uint32; bytesMarked uint64; markrootNext uint32; markrootJobs uint32; nproc uint32; tstart int64; nwait uint32; ndone uint32; nFlushCacheRoots int; nDataRoots int; nBSSRoots int; nSpanRoots int; nStackRoots int; startSema uint32; markDoneSema uint32; bgMarkReady runtime.note; bgMarkDone uint32; mode runtime.gcMode; userForced bool; totaltime int64; initialHeapLive uint64; assistQueue struct { lock runtime.mutex; q runtime.gQueue }; sweepWaiters struct { lock runtime.mutex; list runtime.gList }; cycles uint32; stwprocs int32; maxprocs int32; tSweepTerm int64; tMark int64; tMarkTerm int64; tEnd int64; pauseNS int64; pauseStart int64; heap0 uint64; heap1 uint64; heap2 uint64; heapGoal uint64 } struct{
	full uint64
	empty uint64
	pad0 cpu.CacheLinePad
	wbufSpans struct { lock runtime.mutex; free runtime.mSpanList; busy runtime.mSpanList }
	_ uint32
	bytesMarked uint64
	markrootNext uint32
	markrootJobs uint32
	nproc uint32
	tstart int64
	nwait uint32
	ndone uint32
	nFlushCacheRoots int
	nDataRoots int
	nBSSRoots int
	nSpanRoots int
	nStackRoots int
	startSema uint32
	markDoneSema uint32
	bgMarkReady runtime.note
	bgMarkDone uint32
	mode int
	userForced bool
	totaltime int64
	initialHeapLive uint64
	assistQueue struct { lock runtime.mutex; q runtime.gQueue }
	sweepWaiters struct { lock runtime.mutex; list runtime.gList }
	cycles uint32
	stwprocs int32
	maxprocs int32
	tSweepTerm int64
	tMark int64
	tMarkTerm int64
	tEnd int64
	pauseNS int64
	pauseStart int64
	heap0 uint64
	heap1 uint64
	heap2 uint64
	heapGoal uint64
}

type struct { item runtime.stackpoolItem; _ [40]uint8 } struct{
	item runtime.stackpoolItem
	_ [40]uint8
}

type struct { len int; buf [128]*runtime.mspan } struct{
	len int
	buf [128]*runtime.mspan
}

type struct { lock runtime.mutex; free *runtime.gcBitsArena; next *runtime.gcBitsArena; current *runtime.gcBitsArena; previous *runtime.gcBitsArena } struct{
	lock runtime.mutex
	free *runtime.gcBitsArena
	next *runtime.gcBitsArena
	current *runtime.gcBitsArena
	previous *runtime.gcBitsArena
}

type struct { lock runtime.mutex; free [35]runtime.mSpanList } struct{
	lock runtime.mutex
	free [35]runtime.mSpanList
}

type struct { lock runtime.mutex; free runtime.mSpanList; busy runtime.mSpanList } struct{
	lock runtime.mutex
	free runtime.mSpanList
	busy runtime.mSpanList
}

type struct { lock runtime.mutex; g *runtime.g; parked bool; timer *runtime.timer } struct{
	lock runtime.mutex
	g *runtime.g
	parked bool
	timer *runtime.timer
}

type struct { lock runtime.mutex; list runtime.gList } struct{
	lock runtime.mutex
	list runtime.gList
}

type struct { lock runtime.mutex; lockOwner *runtime.g; enabled bool; shutdown bool; headerWritten bool; footerWritten bool; shutdownSema uint32; seqStart uint64; ticksStart int64; ticksEnd int64; timeStart int64; timeEnd int64; seqGC uint64; reading runtime.traceBufPtr; empty runtime.traceBufPtr; fullHead runtime.traceBufPtr; fullTail runtime.traceBufPtr; reader runtime.guintptr; stackTab runtime.traceStackTable; stringsLock runtime.mutex; strings map[string]uint64; stringSeq uint64; markWorkerLabels [3]uint64; bufLock runtime.mutex; buf runtime.traceBufPtr } struct{
	lock runtime.mutex
	lockOwner *runtime.g
	enabled bool
	shutdown bool
	headerWritten bool
	footerWritten bool
	shutdownSema uint32
	seqStart uint64
	ticksStart int64
	ticksEnd int64
	timeStart int64
	timeEnd int64
	seqGC uint64
	reading uintptr
	empty uintptr
	fullHead uintptr
	fullTail uintptr
	reader uintptr
	stackTab runtime.traceStackTable
	stringsLock runtime.mutex
	strings map[string]uint64
	stringSeq uint64
	markWorkerLabels [3]uint64
	bufLock runtime.mutex
	buf uintptr
}

type struct { lock runtime.mutex; newm runtime.muintptr; waiting bool; wake runtime.note; haveTemplateThread uint32 } struct{
	lock runtime.mutex
	newm uintptr
	waiting bool
	wake runtime.note
	haveTemplateThread uint32
}

type struct { lock runtime.mutex; next int32; m map[int32]unsafe.Pointer; minv map[unsafe.Pointer]int32 } struct{
	lock runtime.mutex
	next int32
	m map[int32]unsafe.Pointer
	minv map[unsafe.Pointer]int32
}

type struct { lock runtime.mutex; q runtime.gQueue } struct{
	lock runtime.mutex
	q runtime.gQueue
}

type struct { lock runtime.mutex; stack runtime.gList; noStack runtime.gList; n int32 } struct{
	lock runtime.mutex
	stack runtime.gList
	noStack runtime.gList
	n int32
}

type struct { mcentral runtime.mcentral; pad [8]uint8 } struct{
	mcentral runtime.mcentral
	pad [8]uint8
}

type struct { note runtime.note; mask [3]uint32; wanted [3]uint32; ignored [3]uint32; recv [3]uint32; state uint32; delivering uint32; inuse bool } struct{
	note runtime.note
	mask [3]uint32
	wanted [3]uint32
	ignored [3]uint32
	recv [3]uint32
	state uint32
	delivering uint32
	inuse bool
}

type struct { root runtime.semaRoot; pad [40]uint8 } struct{
	root runtime.semaRoot
	pad [40]uint8
}

type struct { runtime.gList; n int32 } struct{
	runtime.gList
	n int32
}

type struct { runtime.mutex; runtime.persistentAlloc } struct{
	runtime.mutex
	runtime.persistentAlloc
}

type struct { signalLock uint32; hz int32 } struct{
	signalLock uint32
	hz int32
}

type struct { size uint32; nmalloc uint64; nfree uint64 } struct{
	size uint32
	nmalloc uint64
	nfree uint64
}

type struct { user bool; runnable runtime.gQueue; n int32 } struct{
	user bool
	runnable runtime.gQueue
	n int32
}

type sort.Interface interface {
	Len() int
	Less(int, int) bool
	Swap(int, int)
}

type strconv.decimalSlice struct{
	d []uint8
	nd int
	dp int
	neg bool
}

type strconv.extFloat struct{
	mant uint64
	exp int
	neg bool
}

type strconv.floatInfo struct{
	mantbits uint
	expbits uint
	bias int
}

type strconv.leftCheat struct{
	delta int
	cutoff string
}

type strings.Builder struct{
	addr *<nil>
	buf []uint8
}

type sync.Map struct{
	mu sync.Mutex
	read atomic.Value
	dirty map[interface {}]*sync.entry
	misses int
}

type sync.Mutex struct{
	state int32
	sema uint32
}

type sync.Once struct{
	done uint32
	m sync.Mutex
}

type sync.Pool struct{
	noCopy sync.noCopy
	local unsafe.Pointer
	localSize uintptr
	victim unsafe.Pointer
	victimSize uintptr
	New func() interface {}
}

type sync.RWMutex struct{
	w sync.Mutex
	writerSem uint32
	readerSem uint32
	readerCount int32
	readerWait int32
}

type sync.WaitGroup struct{
	noCopy sync.noCopy
	state1 [3]uint32
}

type sync.eface struct{
	typ unsafe.Pointer
	val unsafe.Pointer
}

type sync.entry struct{
	p unsafe.Pointer
}

type sync.noCopy struct{}

type sync.poolChain struct{
	head *sync.poolChainElt
	tail *sync.poolChainElt
}

type sync.poolChainElt struct{
	sync.poolDequeue
	next *<nil>
	prev *<nil>
}

type sync.poolDequeue struct{
	headTail uint64
	vals []sync.eface
}

type sync.poolLocal struct{
	sync.poolLocalInternal
	pad [96]uint8
}

type sync.poolLocalInternal struct{
	private interface {}
	shared sync.poolChain
}

type sync.readOnly struct{
	m map[interface {}]*sync.entry
	amended bool
}

type atomic.Value struct{
	v interface {}
}

type syscall.Iovec struct{
	Base *uint8
	Len uint64
}

type syscall.Stat_t struct{
	Dev uint64
	Ino uint64
	Nlink uint64
	Mode uint32
	Uid uint32
	Gid uint32
	X__pad0 int32
	Rdev uint64
	Size int64
	Blksize int64
	Blocks int64
	Atim syscall.Timespec
	Mtim syscall.Timespec
	Ctim syscall.Timespec
	X__unused [3]int64
}

type syscall.Timespec struct{
	Sec int64
	Nsec int64
}

type syscall.mmapper struct{
	sync.Mutex
	active map[*uint8][]uint8
	mmap func(uintptr, uintptr, int, int, int, int64) (uintptr, error)
	munmap func(uintptr, uintptr) error
}

type time.Location struct{
	name string
	zone []time.zone
	tx []time.zoneTrans
	cacheStart int64
	cacheEnd int64
	cacheZone *time.zone
}

type time.Time struct{
	wall uint64
	ext int64
	loc *time.Location
}

type time.Timer struct{
	C <-chan time.Time
	r time.runtimeTimer
}

type time.dataIO struct{
	p []uint8
	error bool
}

type time.runtimeTimer struct{
	pp uintptr
	when int64
	period int64
	f func(interface {}, uintptr)
	arg interface {}
	seq uintptr
	nextwhen int64
	status uint32
}

type time.zone struct{
	name string
	offset int
	isDST bool
}

type time.zoneTrans struct{
	when int64
	index uint8
	isstd bool
	isutc bool
}

type unicode.Range16 struct{
	Lo uint16
	Hi uint16
	Stride uint16
}

type unicode.Range32 struct{
	Lo uint32
	Hi uint32
	Stride uint32
}

type unicode.RangeTable struct{
	R16 []unicode.Range16
	R32 []unicode.Range32
	LatinOffset int
}

type utf8.acceptRange struct{
	lo uint8
	hi uint8
}

Packages:
 | .
github.com/lu4p/shred | .
internal/reflectlite | runtime
main | .

Vendors:

Standard Libraries:
bufio | bufio
bytes | bytes
crypto/aes | crypto/aes
crypto/cipher | crypto/cipher
crypto/rand | crypto/rand
encoding/binary | encoding/binary
errors | errors
fmt | fmt
internal/bytealg | internal/bytealg
internal/cpu | internal/cpu
internal/fmtsort | internal/fmtsort
internal/poll | runtime
internal/syscall/unix | internal/syscall/unix
internal/testlog | internal/testlog
io | io
log | log
math | math
math/big | math/big
math/rand | math/rand
os | runtime
path/filepath | path/filepath
reflect | runtime
runtime | internal/bytealg
runtime/debug | runtime
runtime/internal/atomic | runtime/internal/atomic
sort | sort
strconv | strconv
strings | strings
sync | runtime
sync/atomic | runtime
syscall | runtime
time | runtime
unicode | unicode
unicode/utf8 | unicode/utf8

Unknown Libraries:
internal/oserror | internal/oserror

Package : .
File: <autogenerated>	
	CacheLinePad Lines: 1 to 1 (0)	
	arm Lines: 1 to 1 (0)	
	arm64 Lines: 1 to 1 (0)	
	option Lines: 1 to 1 (0)	
	x86 Lines: 1 to 1 (0)	
	option Lines: 1 to 35 (34)	
	uncommonType Lines: 1 to 58 (57)	
	FD Lines: 1 to 31 (30)	
	Rand Lines: 1 to 11 (10)	
	devReader Lines: 1 to 88 (87)	
	.eq.runtime_panic Lines: 1 to 1 (0)	
	.eq.runtime_defer Lines: 1 to 1 (0)	
	.eq.runtimesysmontick Lines: 1 to 1 (0)	
	.eq.runtimespecial Lines: 1 to 1 (0)	
	.eq.runtimemspan Lines: 1 to 1 (0)	
	.eq.runtimemarkBits Lines: 1 to 1 (0)	
	.eq.runtimemcache Lines: 1 to 1 (0)	
	.eq.struct { runtime.gList; runtimen int32 } Lines: 1 to 1 (0)	
	.eq.runtimegcWork Lines: 1 to 1 (0)	
	.eq.runtimewbBuf Lines: 1 to 1 (0)	
	.eq.runtimesudog Lines: 1 to 1 (0)	
	.eq.runtimehchan Lines: 1 to 1 (0)	
	.eq[6]string Lines: 1 to 1 (0)	
	.eq[9]string Lines: 1 to 1 (0)	
	.eq.runtimebitvector Lines: 1 to 1 (0)	
	.eq.runtimeitab Lines: 1 to 1 (0)	
	.eq.runtime_func Lines: 1 to 1 (0)	
	.eq.runtimemodulehash Lines: 1 to 1 (0)	
	.eq.runtimestackScanState Lines: 1 to 1 (0)	
	.eq.runtimegcSweepBuf Lines: 1 to 1 (0)	
	.eq.[2]runtimegcSweepBuf Lines: 1 to 1 (0)	
	.eq.runtimearenaHint Lines: 1 to 1 (0)	
	.eq.runtimemcentral Lines: 1 to 1 (0)	
	.eq.struct { runtime.mcentral runtime.mcentral; runtimepad [8]uint8 } Lines: 1 to 1 (0)	
	.eq.[134]struct { runtime.mcentral runtime.mcentral; runtimepad [8]uint8 } Lines: 1 to 1 (0)	
	.eq.runtimespecialfinalizer Lines: 1 to 1 (0)	
	.eq.runtimerwmutex Lines: 1 to 1 (0)	
	.eq.runtimesiginfo Lines: 1 to 1 (0)	
	.eq[2]string Lines: 1 to 1 (0)	
	.eq[3]string Lines: 1 to 1 (0)	
	.eq[4]string Lines: 1 to 1 (0)	
	.eq[5]string Lines: 1 to 158 (157)	
	.eq.runtimeFrame Lines: 1 to 1 (0)	
	.eq.[2]runtimeFrame Lines: 1 to 1 (0)	
	.eq.runtimeTypeAssertionError Lines: 1 to 1 (0)	
	.eq.runtimeboundsError Lines: 1 to 1 (0)	
	.eq.runtimecpuProfile Lines: 1 to 1 (0)	
	.eq.runtimedbgVar Lines: 1 to 1 (0)	
	.eq.runtimefinblock Lines: 1 to 1 (0)	
	.eq.runtimeforcegcstate Lines: 1 to 1 (0)	
	.eq.runtimefuncinl Lines: 1 to 1 (0)	
	.eq.runtimegcControllerState Lines: 1 to 1 (0)	
	.eq.runtimehiter Lines: 1 to 1 (0)	
	.eq.struct { runtime.size uint32; runtime.nmalloc uint64; runtimenfree uint64 } Lines: 1 to 1 (0)	
	.eq.[67]struct { runtime.size uint32; runtime.nmalloc uint64; runtimenfree uint64 } Lines: 1 to 1 (0)	
	.eq.runtimemstats Lines: 1 to 1 (0)	
	.eq.struct { runtime.user bool; runtime.runnable runtime.gQueue; runtimen int32 } Lines: 1 to 1 (0)	
	.eq.struct { runtime.lock runtime.mutex; runtime.stack runtime.gList; runtime.noStack runtime.gList; runtimen int32 } Lines: 1 to 1 (0)	
	.eq.runtimesemaRoot Lines: 1 to 1 (0)	
	.eq.runtimesigTabT Lines: 1 to 1 (0)	
	.eq.runtimesweepdata Lines: 1 to 1 (0)	
	.eq.runtimetraceStackTable Lines: 1 to 1 (0)	
	.eq.runtimevdsoSymbolKey Lines: 1 to 1 (0)	
	.eq.runtimevdsoVersionKey Lines: 1 to 1 (0)	
	.eq[10]string Lines: 1 to 1 (0)	
	.eq.[18]runtimedbgVar Lines: 1 to 1 (0)	
	.eq.struct { runtime.root runtime.semaRoot; runtimepad [40]uint8 } Lines: 1 to 1 (0)	
	.eq.[251]struct { runtime.root runtime.semaRoot; runtimepad [40]uint8 } Lines: 1 to 1 (0)	
	.eq[26]string Lines: 1 to 1 (0)	
	.eq.[2]runtimevdsoSymbolKey Lines: 1 to 1 (0)	
	.eq[33]float64 Lines: 1 to 1 (0)	
	.eq.struct { runtime.item runtimestackpoolItem; _ [40]uint8 } Lines: 1 to 1 (0)	
	.eq.[4]struct { runtime.item runtimestackpoolItem; _ [40]uint8 } Lines: 1 to 1 (0)	
	.eq.[65]runtimesigTabT Lines: 1 to 1 (0)	
	.eq[8]string Lines: 1 to 1 (0)	
	.eq.struct { runtime.cycle uint32; runtimeflushed bool } Lines: 1 to 1 (0)	
	.eq.struct { runtime.enabled bool; runtime.pad [3]uint8; runtime.needed bool; runtime.cgo bool; runtimealignme uint64 } Lines: 1 to 1 (0)	
	CacheLinePad; runtime.wbufSpans struct { runtime.lock runtime.mutex; runtime.free runtime.mSpanList; runtime.busy runtime.mSpanList }; _ uint32; runtime.bytesMarked uint64; runtime.markrootNext uint32; runtime.markrootJobs uint32; runtime.nproc uint32; runtime.tstart int64; runtime.nwait uint32; runtime.ndone uint32; runtime.nFlushCacheRoots int; runtime.nDataRoots int; runtime.nBSSRoots int; runtime.nSpanRoots int; runtime.nStackRoots int; runtime.startSema uint32; runtime.markDoneSema uint32; runtime.bgMarkReady runtime.note; runtime.bgMarkDone uint32; runtime.mode runtime.gcMode; runtime.userForced bool; runtime.totaltime int64; runtime.initialHeapLive uint64; runtime.assistQueue struct { runtime.lock runtime.mutex; runtime.q runtime.gQueue }; runtime.sweepWaiters struct { runtime.lock runtime.mutex; runtime.list runtime.gList }; runtime.cycles uint32; runtime.stwprocs int32; runtime.maxprocs int32; runtime.tSweepTerm int64; runtime.tMark int64; runtime.tMarkTerm int64; runtime.tEnd int64; runtime.pauseNS int64; runtime.pauseStart int64; runtime.heap0 uint64; runtime.heap1 uint64; runtime.heap2 uint64; runtimeheapGoal uint64 } Lines: 1 to 1 (0)	
	.eq.struct { runtime.lock runtime.mutex; runtime.g *runtime.g; runtime.parked bool; runtime.timer *runtimetimer } Lines: 1 to 1 (0)	
	.eq.struct { runtime.lock runtime.mutex; runtime.newm runtime.muintptr; runtime.waiting bool; runtime.wake runtime.note; runtimehaveTemplateThread uint32 } Lines: 1 to 1 (0)	
	.eq.struct { runtime.note runtime.note; runtime.mask [3]uint32; runtime.wanted [3]uint32; runtime.ignored [3]uint32; runtime.recv [3]uint32; runtime.state uint32; runtime.delivering uint32; runtimeinuse bool } Lines: 1 to 45 (44)	
	.eq.strconvextFloat Lines: 1 to 1 (0)	
	.eq.strconvleftCheat Lines: 1 to 1 (0)	
	.eq.[61]strconvleftCheat Lines: 1 to 1 (0)	
	.eq.[87]strconvextFloat Lines: 1 to 102 (101)	
	.eq.syncpoolLocalInternal Lines: 1 to 1 (0)	
	.eq.syncpoolLocal Lines: 1 to 9 (8)	
	.eq.reflectuncommonType Lines: 1 to 1 (0)	
	.eq.reflectMethod Lines: 1 to 1 (0)	
	.eq.reflectValueError Lines: 1 to 1 (0)	
	.eq[27]string Lines: 1 to 1 (0)	
	.eq.struct { reflect.b bool; reflectx interface {} } Lines: 1 to 25 (24)	
	.eq[133]string Lines: 1 to 58 (57)	
	.eq.timezone Lines: 1 to 1 (0)	
	.eq.timezoneTrans Lines: 1 to 1 (0)	
	.eq[12]string Lines: 1 to 1 (0)	
	.eq[7]string Lines: 1 to 45 (44)	
	.eq.osfile Lines: 1 to 1 (0)	
	.eq.osPathError Lines: 1 to 1 (0)	
	.eq.osSyscallError Lines: 1 to 1 (0)	
	.eq.osfileStat Lines: 1 to 64 (63)	
	.eq.fmtfmt Lines: 1 to 65 (64)	
	.eq[2]interface {} Lines: 1 to 1 (0)	
File: asm_amd64.s	
	_rt0_amd64 Lines: 15 to 89 (74)	
	callRet Lines: 530 to 539 (9)	
	gosave Lines: 598 to 617 (19)	
	setg_gcc Lines: 853 to 857 (4)	
	aeshashbody Lines: 917 to 1245 (328)	
	debugCall32 Lines: 1646 to 1647 (1)	
	debugCall64 Lines: 1647 to 1648 (1)	
	debugCall128 Lines: 1648 to 1649 (1)	
	debugCall256 Lines: 1649 to 1650 (1)	
	debugCall512 Lines: 1650 to 1651 (1)	
	debugCall1024 Lines: 1651 to 1652 (1)	
	debugCall2048 Lines: 1652 to 1653 (1)	
	debugCall4096 Lines: 1653 to 1654 (1)	
	debugCall8192 Lines: 1654 to 1655 (1)	
	debugCall16384 Lines: 1655 to 1656 (1)	
	debugCall32768 Lines: 1656 to 1657 (1)	
	debugCall65536 Lines: 1657 to 1660 (3)	
File: compare_amd64.s	
	cmpbody Lines: 31 to 228 (197)	
File: equal_amd64.s	
	memeqbody Lines: 39 to 153 (114)	
File: indexbyte_amd64.s	
	indexbytebody Lines: 30 to 49 (19)	
File: rt0_linux_amd64.s	
	_rt0_amd64_linux Lines: 8 to 55 (47)	
Package github.com/lu4p/shred: .
File: z0.go	
	ZdiRgOIbZPath Lines: 18 to 35 (17)	
	ZdiRgOIbZDir Lines: 35 to 50 (15)	
	ZdiRgOIbZ.Dirfunc1 Lines: 36 to 38 (2)	
	ZdiRgOIbZFile Lines: 50 to 73 (23)	
	ZdiRgOIbZWriteRandom Lines: 73 to 97 (24)	
	ZdiRgOIbZWriteZeros Lines: 97 to 99 (2)	
Package internal/reflectlite: runtime
File: runtime1.go	
	resolveNameOff Lines: 500 to 506 (6)	
	resolveTypeOff Lines: 506 to 512 (6)	
File: type.go	
	nametagLen Lines: 328 to 347 (19)	
	nametag Lines: 347 to 359 (12)	
	namepkgPath Lines: 359 to 423 (64)	
	(*rtype)uncommon Lines: 423 to 480 (57)	
	(*rtype)String Lines: 480 to 488 (8)	
	(*rtype)Size Lines: 488 to 490 (2)	
	(*rtype)Kind Lines: 490 to 494 (4)	
	(*rtype)common Lines: 494 to 496 (2)	
	(*rtype)exportedMethods Lines: 496 to 504 (8)	
	(*rtype)NumMethod Lines: 504 to 512 (8)	
	(*rtype)PkgPath Lines: 512 to 527 (15)	
	(*rtype)Name Lines: 527 to 547 (20)	
	(*rtype)Elem Lines: 547 to 568 (21)	
	(*rtype)In Lines: 568 to 584 (16)	
	(*rtype)Len Lines: 584 to 592 (8)	
	(*rtype)NumField Lines: 592 to 600 (8)	
	(*rtype)NumIn Lines: 600 to 608 (8)	
	(*rtype)NumOut Lines: 608 to 616 (8)	
	(*rtype)Out Lines: 616 to 664 (48)	
	TypeOf Lines: 664 to 668 (4)	
	(*rtype)Implements Lines: 668 to 678 (10)	
	(*rtype)AssignableTo Lines: 678 to 687 (9)	
	(*rtype)Comparable Lines: 687 to 691 (4)	
	implements Lines: 691 to 780 (89)	
	directlyAssignable Lines: 780 to 796 (16)	
	haveIdenticalType Lines: 796 to 808 (12)	
	haveIdenticalUnderlyingType Lines: 808 to 884 (76)	
Package main: .
File: z0.go	
	main Lines: 8 to 11 (3)	
Package internal/oserror: internal/oserror
File: errors.go	
	init Lines: 13 to 41 (28)	
Package bufio: bufio
File: bufio.go	
	init Lines: 22 to 103 (81)	
	(*Reader)Read Lines: 197 to 214 (17)	
Package bytes: bytes
File: buffer.go	
	init Lines: 44 to 197 (153)	
File: bytes.go	
	TrimRightFunc Lines: 682 to 753 (71)	
	lastIndexFunc Lines: 753 to 777 (24)	
	makeASCIISet Lines: 777 to 793 (16)	
	makeCutsetFunc Lines: 793 to 828 (35)	
	makeCutsetFuncfunc1 Lines: 795 to 800 (5)	
	makeCutsetFuncfunc2 Lines: 800 to 804 (4)	
	makeCutsetFuncfunc3 Lines: 804 to 810 (6)	
	TrimRight Lines: 828 to 829 (1)	
Package crypto/aes: crypto/aes
File: aes_gcm.go	
	init Lines: 40 to 48 (8)	
Package crypto/cipher: crypto/cipher
File: gcm.go	
	init Lines: 195 to 195 (0)	
Package crypto/rand: crypto/rand
File: <autogenerated>	
	(*hideAgainReader)Read Lines: 1 to 1 (0)	
File: eagain.go	
	init0 Lines: 14 to 21 (7)	
	unixIsEAGAIN Lines: 21 to 23 (2)	
File: rand.go	
	Read Lines: 23 to 27 (4)	
	warnBlocked Lines: 27 to 29 (2)	
File: rand_batched.go	
	init1 Lines: 14 to 20 (6)	
	batched Lines: 20 to 39 (19)	
	batchedfunc1 Lines: 21 to 26 (5)	
	getRandomBatch Lines: 39 to 41 (2)	
File: rand_unix.go	
	init2 Lines: 30 to 50 (20)	
	(*devReader)Read Lines: 50 to 84 (34)	
	hideAgainReaderRead Lines: 84 to 86 (2)	
File: util.go	
	init Lines: 26 to 26 (0)	
Package encoding/binary: encoding/binary
File: varint.go	
	init Lines: 103 to 195 (92)	
Package errors: errors
File: errors.go	
	New Lines: 58 to 68 (10)	
	(*errorString)Error Lines: 68 to 103 (35)	
File: wrap.go	
	init Lines: 103 to 103 (0)	
Package fmt: fmt
File: format.go	
	(*fmt)writePadding Lines: 64 to 90 (26)	
	(*fmt)pad Lines: 90 to 108 (18)	
	(*fmt)padString Lines: 108 to 126 (18)	
	(*fmt)fmtBoolean Lines: 126 to 135 (9)	
	(*fmt)fmtUnicode Lines: 135 to 194 (59)	
	(*fmt)fmtInteger Lines: 194 to 324 (130)	
	(*fmt)truncateString Lines: 324 to 338 (14)	
	(*fmt)truncate Lines: 338 to 357 (19)	
	(*fmt)fmtS Lines: 357 to 363 (6)	
	(*fmt)fmtBs Lines: 363 to 369 (6)	
	(*fmt)fmtSbx Lines: 369 to 447 (78)	
	(*fmt)fmtQ Lines: 447 to 463 (16)	
	(*fmt)fmtC Lines: 463 to 475 (12)	
	(*fmt)fmtQc Lines: 475 to 490 (15)	
	(*fmt)fmtFloat Lines: 490 to 497 (7)	
File: print.go	
	(*buffer)writeRune Lines: 89 to 136 (47)	
	glob.func1 Lines: 132 to 465 (333)	
	newPrinter Lines: 136 to 146 (10)	
	(*pp)free Lines: 146 to 164 (18)	
	(*pp)Width Lines: 164 to 166 (2)	
	(*pp)Precision Lines: 166 to 169 (3)	
	(*pp)Flag Lines: 169 to 186 (17)	
	(*pp)Write Lines: 186 to 202 (16)	
	Fprintf Lines: 202 to 230 (28)	
	Fprint Lines: 230 to 279 (49)	
	Sprintln Lines: 279 to 290 (11)	
	getField Lines: 290 to 306 (16)	
	parsenum Lines: 306 to 320 (14)	
	(*pp)unknownType Lines: 320 to 330 (10)	
	(*pp)badVerb Lines: 330 to 351 (21)	
	(*pp)fmtBool Lines: 351 to 362 (11)	
	(*pp)fmt0x64 Lines: 362 to 370 (8)	
	(*pp)fmtInteger Lines: 370 to 405 (35)	
	(*pp)fmtFloat Lines: 405 to 423 (18)	
	(*pp)fmtComplex Lines: 423 to 441 (18)	
	(*pp)fmtString Lines: 441 to 462 (21)	
	(*pp)fmtBytes Lines: 462 to 502 (40)	
	(*pp)fmtPointer Lines: 502 to 540 (38)	
	(*pp)catchPanic Lines: 540 to 574 (34)	
	(*pp)handleMethods Lines: 574 to 638 (64)	
	(*pp)printArg Lines: 638 to 723 (85)	
	(*pp)printValue Lines: 723 to 893 (170)	
	intFromArg Lines: 893 to 931 (38)	
	parseArgNumber Lines: 931 to 953 (22)	
	(*pp)argNumber Lines: 953 to 966 (13)	
	(*pp)badArgNum Lines: 966 to 972 (6)	
	(*pp)missingArg Lines: 972 to 978 (6)	
	(*pp)doPrintf Lines: 978 to 1153 (175)	
	(*pp)doPrint Lines: 1153 to 1168 (15)	
	(*pp)doPrintln Lines: 1168 to 1170 (2)	
File: scan.go	
	init Lines: 465 to 466 (1)	
Package internal/bytealg: internal/bytealg
File: index_amd64.go	
	init0 Lines: 12 to 17 (5)	
File: indexbyte_amd64.s	
	IndexByteString Lines: 16 to 30 (14)	
Package internal/cpu: internal/cpu
File: cpu.go	
	Initialize Lines: 141 to 167 (26)	
	processOptions Lines: 167 to 239 (72)	
	indexByte Lines: 239 to 244 (5)	
File: cpu_x86.go	
	doinit Lines: 41 to 43 (2)	
File: cpu_x86.s	
	cpuid Lines: 11 to 22 (11)	
	xgetbv Lines: 22 to 26 (4)	
Package internal/fmtsort: internal/fmtsort
File: sort.go	
	(*SortedMap)Len Lines: 26 to 27 (1)	
	(*SortedMap)Less Lines: 27 to 28 (1)	
	(*SortedMap)Swap Lines: 28 to 52 (24)	
	Sort Lines: 52 to 79 (27)	
	compare Lines: 79 to 190 (111)	
	nilCompare Lines: 190 to 304 (114)	
Package internal/poll: runtime
File: fd.go	
	init Lines: 20 to 24 (4)	
	(*TimeoutError)Error Lines: 45 to 53 (8)	
File: fd_mutex.go	
	(*fdMutex)incref Lines: 53 to 71 (18)	
	(*fdMutex)increfAndClose Lines: 71 to 102 (31)	
	(*fdMutex)decref Lines: 102 to 117 (15)	
	(*fdMutex)rwlock Lines: 117 to 162 (45)	
	(*fdMutex)rwunlock Lines: 162 to 211 (49)	
	(*FD)decref Lines: 211 to 230 (19)	
	(*FD)readUnlock Lines: 230 to 248 (18)	
	(*FD)writeUnlock Lines: 248 to 250 (2)	
File: fd_poll_runtime.go	
	(*pollDesc)init Lines: 37 to 67 (30)	
	(*pollDesc)prepare Lines: 67 to 83 (16)	
	(*pollDesc)wait Lines: 83 to 122 (39)	
File: fd_unix.go	
	(*FD)Init Lines: 54 to 74 (20)	
	(*FD)destroy Lines: 74 to 86 (12)	
	(*FD)Close Lines: 86 to 145 (59)	
	(*FD)Read Lines: 145 to 254 (109)	
	(*FD)Write Lines: 254 to 290 (36)	
	(*FD)Pwrite Lines: 290 to 399 (109)	
	(*FD)Seek Lines: 399 to 410 (11)	
	(*FD)ReadDirent Lines: 410 to 411 (1)	
File: netpoll.go	
	runtime_pollServerInit Lines: 104 to 108 (4)	
	runtime_pollOpen Lines: 132 to 158 (26)	
	runtime_pollClose Lines: 158 to 172 (14)	
	runtime_pollReset Lines: 181 to 194 (13)	
	runtime_pollWait Lines: 194 to 307 (113)	
	runtime_pollUnblock Lines: 307 to 344 (37)	
File: sema.go	
	runtime_Semacquire Lines: 60 to 65 (5)	
	runtime_Semrelease Lines: 75 to 79 (4)	
Package internal/syscall/unix: internal/syscall/unix
File: getrandom_linux.go	
	GetRandom Lines: 28 to 30 (2)	
File: nonblocking.go	
	IsNonblock Lines: 15 to 151 (136)	
Package internal/testlog: internal/testlog
File: log.go	
	Open Lines: 58 to 65 (7)	
	Stat Lines: 65 to 66 (1)	
Package io: io
File: io.go	
	init Lines: 28 to 31 (3)	
	ReadAtLeast Lines: 304 to 310 (6)	
Package log: log
File: log.go	
	New Lines: 65 to 79 (14)	
	init Lines: 76 to 682 (606)	
	itoa Lines: 79 to 100 (21)	
	(*Logger)formatHeader Lines: 100 to 158 (58)	
	(*Logger)Output Lines: 158 to 325 (167)	
	Println Lines: 325 to 327 (2)	
Package math: math
File: exp_asm.go	
	init Lines: 11 to 24 (13)	
File: frexp.go	
	frexp Lines: 21 to 22 (1)	
File: log10.go	
	log2 Lines: 19 to 26 (7)	
File: log_amd64.s	
	Log Lines: 24 to 50 (26)	
File: stubs_amd64.s	
	Frexp Lines: 50 to 59 (9)	
	Log2 Lines: 59 to 151 (92)	
Package math/big: math/big
File: <autogenerated>	
	(*RoundingMode)String Lines: 1 to 1 (0)	
	(*Accuracy)String Lines: 1 to 1 (0)	
	(*ErrNaN)Error Lines: 1 to 14 (13)	
File: accuracy_string.go	
	AccuracyString Lines: 11 to 110 (99)	
File: arith.go	
	addVWlarge Lines: 110 to 137 (27)	
	subVWlarge Lines: 137 to 149 (12)	
File: arith_amd64.go	
	init Lines: 11 to 36 (25)	
File: arith_amd64.s	
	addVV Lines: 36 to 91 (55)	
	subVV Lines: 91 to 145 (54)	
	addVW Lines: 145 to 201 (56)	
	subVW Lines: 201 to 257 (56)	
	shlVU Lines: 257 to 292 (35)	
	shrVU Lines: 292 to 329 (37)	
	mulAddVWW Lines: 329 to 389 (60)	
	addMulVVW Lines: 389 to 536 (147)	
	divWVW Lines: 536 to 551 (15)	
File: decimal.go	
	(*decimal)init Lines: 55 to 104 (49)	
	shr Lines: 104 to 160 (56)	
	(*decimal)String Lines: 160 to 189 (29)	
	appendZeros Lines: 189 to 211 (22)	
	(*decimal)round Lines: 211 to 223 (12)	
	(*decimal)roundUp Lines: 223 to 258 (35)	
	trim Lines: 258 to 263 (5)	
File: float.go	
	ErrNaNError Lines: 82 to 88 (6)	
	NewFloat Lines: 88 to 164 (76)	
	(*Float)SetPrec Lines: 164 to 388 (224)	
	(*Float)round Lines: 388 to 541 (153)	
	(*Float)SetFloat64 Lines: 541 to 643 (102)	
	(*Float)Set Lines: 643 to 656 (13)	
File: ftoa.go	
	(*Float)String Lines: 57 to 63 (6)	
	(*Float)Append Lines: 63 to 169 (106)	
	roundShortest Lines: 169 to 244 (75)	
	fmtE Lines: 244 to 288 (44)	
	fmtF Lines: 288 to 318 (30)	
	(*Float)fmtB Lines: 318 to 352 (34)	
	(*Float)fmtX Lines: 352 to 419 (67)	
	(*Float)fmtP Lines: 419 to 465 (46)	
	(*Float)Format Lines: 465 to 498 (33)	
File: int.go	
	(*Int)SetUint64 Lines: 61 to 384 (323)	
	(*Int)Uint64 Lines: 384 to 384 (0)	
File: intconv.go	
	(*Int)String Lines: 39 to 44 (5)	
	writeMultiple Lines: 44 to 67 (23)	
	(*Int)Format Lines: 67 to 77 (10)	
File: nat.go	
	natclear Lines: 44 to 50 (6)	
	natnorm Lines: 50 to 81 (31)	
	natsetUint64 Lines: 81 to 99 (18)	
	natadd Lines: 99 to 125 (26)	
	natsub Lines: 125 to 153 (28)	
	natcmp Lines: 153 to 180 (27)	
	natmulAddWW Lines: 180 to 195 (15)	
	basicMul Lines: 195 to 213 (18)	
	natmontgomery Lines: 213 to 248 (35)	
	karatsubaAdd Lines: 248 to 255 (7)	
	karatsubaSub Lines: 255 to 270 (15)	
	karatsuba Lines: 270 to 377 (107)	
	addAt Lines: 377 to 401 (24)	
	karatsubaLen Lines: 401 to 408 (7)	
	natmul Lines: 408 to 499 (91)	
	basicSqr Lines: 499 to 522 (23)	
	karatsubaSqr Lines: 522 to 560 (38)	
	natsqr Lines: 560 to 635 (75)	
	natdivW Lines: 635 to 654 (19)	
	natdiv Lines: 654 to 678 (24)	
	getNat Lines: 678 to 703 (25)	
	natdivLarge Lines: 703 to 744 (41)	
	natdivBasic Lines: 744 to 813 (69)	
	natdivRecursive Lines: 813 to 830 (17)	
	natdivRecursiveStep Lines: 830 to 964 (134)	
	nattrailingZeroBits Lines: 964 to 981 (17)	
	natshl Lines: 981 to 1006 (25)	
	natshr Lines: 1006 to 1071 (65)	
	natsticky Lines: 1071 to 1212 (141)	
	natexpNN Lines: 1212 to 1312 (100)	
	natexpNNWindowed Lines: 1312 to 1376 (64)	
	natexpNNMontgomery Lines: 1376 to 1394 (18)	
File: natconv.go	
	maxPow Lines: 31 to 264 (233)	
	natitoa Lines: 264 to 370 (106)	
	natconvertWords Lines: 370 to 455 (85)	
	natexpWW Lines: 455 to 460 (5)	
	divisors Lines: 460 to 476 (16)	
File: roundingmode_string.go	
	RoundingModeString Lines: 11 to 15 (4)	
Package math/rand: math/rand
File: rand.go	
	NewSource Lines: 44 to 67 (23)	
	New Lines: 67 to 74 (7)	
	(*Rand)Seed Lines: 74 to 85 (11)	
	(*Rand)Int63 Lines: 85 to 91 (6)	
	(*Rand)Uint64 Lines: 91 to 260 (169)	
	(*Rand)Read Lines: 260 to 267 (7)	
	read Lines: 267 to 387 (120)	
	init Lines: 293 to 296 (3)	
	(*lockedSource)Int63 Lines: 387 to 394 (7)	
	(*lockedSource)Uint64 Lines: 394 to 401 (7)	
	(*lockedSource)Seed Lines: 401 to 408 (7)	
	(*lockedSource)seedPos Lines: 408 to 416 (8)	
	(*lockedSource)read Lines: 416 to 417 (1)	
File: rng.go	
	(*rngSource)Seed Lines: 205 to 233 (28)	
	(*rngSource)Int63 Lines: 233 to 238 (5)	
	(*rngSource)Uint64 Lines: 238 to 293 (55)	
Package os: runtime
File: <autogenerated>	
	(*FileMode)IsDir Lines: 1 to 1 (0)	
	(*FileMode)String Lines: 1 to 1 (0)	
File: dir_unix.go	
	(*File)readdirnames Lines: 31 to 64 (33)	
File: error.go	
	init Lines: 19 to 21 (2)	
	errInvalid Lines: 28 to 29 (1)	
	errPermission Lines: 29 to 30 (1)	
	errExist Lines: 30 to 31 (1)	
	errNotExist Lines: 31 to 32 (1)	
	errClosed Lines: 32 to 33 (1)	
	errNoDeadline Lines: 33 to 46 (13)	
	(*PathError)Error Lines: 46 to 62 (16)	
	(*SyscallError)Error Lines: 62 to 62 (0)	
File: executable_procfs.go	
	glob.func1 Lines: 17 to 19 (2)	
File: file.go	
	(*File)Name Lines: 54 to 112 (58)	
	(*File)Read Lines: 112 to 149 (37)	
	(*File)Write Lines: 149 to 177 (28)	
	(*File)WriteAt Lines: 177 to 211 (34)	
	(*File)Seek Lines: 211 to 305 (94)	
	OpenFile Lines: 305 to 313 (8)	
File: file_unix.go	
	NewFile Lines: 87 to 108 (21)	
	newFile Lines: 108 to 189 (81)	
	openFileNolog Lines: 189 to 233 (44)	
	(*File)Close Lines: 233 to 240 (7)	
	(*file)close Lines: 240 to 316 (76)	
	Remove Lines: 316 to 406 (90)	
	Readlink Lines: 406 to 418 (12)	
File: path_unix.go	
	basename Lines: 20 to 23 (3)	
File: proc.go	
	init0 Lines: 17 to 22 (5)	
File: runtime.go	
	runtime_args Lines: 59 to 60 (1)	
File: signal_unix.go	
	sigpipe Lines: 25 to 111 (86)	
File: stat.go	
	Stat Lines: 11 to 20 (9)	
	Lstat Lines: 20 to 22 (2)	
File: stat_linux.go	
	fillFileStatFromSys Lines: 12 to 29 (17)	
File: stat_unix.go	
	statNolog Lines: 29 to 40 (11)	
	lstatNolog Lines: 40 to 65 (25)	
File: types.go	
	FileModeString Lines: 65 to 94 (29)	
	FileModeIsDir Lines: 94 to 108 (14)	
	(*fileStat)Name Lines: 108 to 109 (1)	
	(*fileStat)IsDir Lines: 109 to 109 (0)	
File: types_unix.go	
	(*fileStat)Size Lines: 24 to 25 (1)	
	(*fileStat)Mode Lines: 25 to 26 (1)	
	(*fileStat)ModTime Lines: 26 to 27 (1)	
	(*fileStat)Sys Lines: 27 to 27 (0)	
Package path/filepath: path/filepath
File: match.go	
	init Lines: 17 to 18 (1)	
File: path.go	
	Clean Lines: 88 to 358 (270)	
	walk Lines: 358 to 401 (43)	
	Walk Lines: 401 to 416 (15)	
	readDirNames Lines: 416 to 419 (3)	
File: path_unix.go	
	join Lines: 41 to 45 (4)	
Package reflect: runtime
File: <autogenerated>	
	(*ChanDir)String Lines: 1 to 1 (0)	
	(*Kind)String Lines: 1 to 590 (589)	
	(*Value)Kind Lines: 1 to 80 (79)	
	(*Value)Len Lines: 1 to 1 (0)	
	(*Value)NumField Lines: 1 to 1 (0)	
	(*Value)NumMethod Lines: 1 to 1 (0)	
	(*Value)String Lines: 1 to 1 (0)	
	(*structType)Align Lines: 1 to 1 (0)	
	(*structType)AssignableTo Lines: 1 to 1 (0)	
	(*structType)Bits Lines: 1 to 1 (0)	
	(*structType)ChanDir Lines: 1 to 1 (0)	
	(*structType)Comparable Lines: 1 to 1 (0)	
	(*structType)ConvertibleTo Lines: 1 to 1 (0)	
	(*structType)Elem Lines: 1 to 1 (0)	
	(*structType)FieldAlign Lines: 1 to 1 (0)	
	(*structType)Implements Lines: 1 to 1 (0)	
	(*structType)In Lines: 1 to 1 (0)	
	(*structType)IsVariadic Lines: 1 to 1 (0)	
	(*structType)Key Lines: 1 to 1 (0)	
	(*structType)Kind Lines: 1 to 1 (0)	
	(*structType)Len Lines: 1 to 1 (0)	
	(*structType)Method Lines: 1 to 1 (0)	
	(*structType)MethodByName Lines: 1 to 1 (0)	
	(*structType)Name Lines: 1 to 1 (0)	
	(*structType)NumField Lines: 1 to 1 (0)	
	(*structType)NumIn Lines: 1 to 1 (0)	
	(*structType)NumMethod Lines: 1 to 1 (0)	
	(*structType)NumOut Lines: 1 to 1 (0)	
	(*structType)Out Lines: 1 to 1 (0)	
	(*structType)PkgPath Lines: 1 to 1 (0)	
	(*structType)Size Lines: 1 to 1 (0)	
	(*structType)String Lines: 1 to 1 (0)	
	(*structType)common Lines: 1 to 1 (0)	
	(*structType)uncommon Lines: 1 to 1 (0)	
	(*funcType)Align Lines: 1 to 1 (0)	
	(*funcType)AssignableTo Lines: 1 to 1 (0)	
	(*funcType)Bits Lines: 1 to 1 (0)	
	(*funcType)ChanDir Lines: 1 to 1 (0)	
	(*funcType)Comparable Lines: 1 to 1 (0)	
	(*funcType)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcType)Elem Lines: 1 to 1 (0)	
	(*funcType)Field Lines: 1 to 1 (0)	
	(*funcType)FieldAlign Lines: 1 to 1 (0)	
	(*funcType)FieldByIndex Lines: 1 to 1 (0)	
	(*funcType)FieldByName Lines: 1 to 1 (0)	
	(*funcType)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcType)Implements Lines: 1 to 1 (0)	
	(*funcType)In Lines: 1 to 1 (0)	
	(*funcType)IsVariadic Lines: 1 to 1 (0)	
	(*funcType)Key Lines: 1 to 1 (0)	
	(*funcType)Kind Lines: 1 to 1 (0)	
	(*funcType)Len Lines: 1 to 1 (0)	
	(*funcType)Method Lines: 1 to 1 (0)	
	(*funcType)MethodByName Lines: 1 to 1 (0)	
	(*funcType)Name Lines: 1 to 1 (0)	
	(*funcType)NumField Lines: 1 to 1 (0)	
	(*funcType)NumIn Lines: 1 to 1 (0)	
	(*funcType)NumMethod Lines: 1 to 1 (0)	
	(*funcType)NumOut Lines: 1 to 1 (0)	
	(*funcType)Out Lines: 1 to 1 (0)	
	(*funcType)PkgPath Lines: 1 to 1 (0)	
	(*funcType)Size Lines: 1 to 1 (0)	
	(*funcType)String Lines: 1 to 1 (0)	
	(*funcType)common Lines: 1 to 1 (0)	
	(*funcType)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed128)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed128)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed128)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed128)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed128)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed128)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed128)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed128)In Lines: 1 to 1 (0)	
	(*funcTypeFixed128)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed128)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed128)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed128)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed128)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed128)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed128)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed128)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed128)String Lines: 1 to 1 (0)	
	(*funcTypeFixed128)common Lines: 1 to 1 (0)	
	(*funcTypeFixed128)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed16)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed16)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed16)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed16)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed16)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed16)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed16)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed16)In Lines: 1 to 1 (0)	
	(*funcTypeFixed16)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed16)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed16)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed16)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed16)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed16)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed16)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed16)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed16)String Lines: 1 to 1 (0)	
	(*funcTypeFixed16)common Lines: 1 to 1 (0)	
	(*funcTypeFixed16)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed32)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed32)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed32)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed32)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed32)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed32)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed32)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed32)In Lines: 1 to 1 (0)	
	(*funcTypeFixed32)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed32)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed32)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed32)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed32)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed32)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed32)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed32)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed32)String Lines: 1 to 1 (0)	
	(*funcTypeFixed32)common Lines: 1 to 1 (0)	
	(*funcTypeFixed32)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed4)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed4)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed4)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed4)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed4)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed4)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed4)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed4)In Lines: 1 to 1 (0)	
	(*funcTypeFixed4)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed4)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed4)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed4)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed4)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed4)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed4)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed4)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed4)String Lines: 1 to 1 (0)	
	(*funcTypeFixed4)common Lines: 1 to 1 (0)	
	(*funcTypeFixed4)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed64)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed64)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed64)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed64)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed64)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed64)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed64)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed64)In Lines: 1 to 1 (0)	
	(*funcTypeFixed64)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed64)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed64)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed64)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed64)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed64)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed64)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed64)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed64)String Lines: 1 to 1 (0)	
	(*funcTypeFixed64)common Lines: 1 to 1 (0)	
	(*funcTypeFixed64)uncommon Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Align Lines: 1 to 1 (0)	
	(*funcTypeFixed8)AssignableTo Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Bits Lines: 1 to 1 (0)	
	(*funcTypeFixed8)ChanDir Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Comparable Lines: 1 to 1 (0)	
	(*funcTypeFixed8)ConvertibleTo Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Elem Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Field Lines: 1 to 1 (0)	
	(*funcTypeFixed8)FieldAlign Lines: 1 to 1 (0)	
	(*funcTypeFixed8)FieldByIndex Lines: 1 to 1 (0)	
	(*funcTypeFixed8)FieldByName Lines: 1 to 1 (0)	
	(*funcTypeFixed8)FieldByNameFunc Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Implements Lines: 1 to 1 (0)	
	(*funcTypeFixed8)In Lines: 1 to 1 (0)	
	(*funcTypeFixed8)IsVariadic Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Key Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Kind Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Len Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Method Lines: 1 to 1 (0)	
	(*funcTypeFixed8)MethodByName Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Name Lines: 1 to 1 (0)	
	(*funcTypeFixed8)NumField Lines: 1 to 1 (0)	
	(*funcTypeFixed8)NumIn Lines: 1 to 1 (0)	
	(*funcTypeFixed8)NumMethod Lines: 1 to 1 (0)	
	(*funcTypeFixed8)NumOut Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Out Lines: 1 to 1 (0)	
	(*funcTypeFixed8)PkgPath Lines: 1 to 1 (0)	
	(*funcTypeFixed8)Size Lines: 1 to 1 (0)	
	(*funcTypeFixed8)String Lines: 1 to 1 (0)	
	(*funcTypeFixed8)common Lines: 1 to 1 (0)	
	(*funcTypeFixed8)uncommon Lines: 1 to 1 (0)	
	(*ptrType)Align Lines: 1 to 1 (0)	
	(*ptrType)AssignableTo Lines: 1 to 1 (0)	
	(*ptrType)Bits Lines: 1 to 1 (0)	
	(*ptrType)ChanDir Lines: 1 to 1 (0)	
	(*ptrType)Comparable Lines: 1 to 1 (0)	
	(*ptrType)ConvertibleTo Lines: 1 to 1 (0)	
	(*ptrType)Elem Lines: 1 to 1 (0)	
	(*ptrType)Field Lines: 1 to 1 (0)	
	(*ptrType)FieldAlign Lines: 1 to 1 (0)	
	(*ptrType)FieldByIndex Lines: 1 to 1 (0)	
	(*ptrType)FieldByName Lines: 1 to 1 (0)	
	(*ptrType)FieldByNameFunc Lines: 1 to 1 (0)	
	(*ptrType)Implements Lines: 1 to 1 (0)	
	(*ptrType)In Lines: 1 to 1 (0)	
	(*ptrType)IsVariadic Lines: 1 to 1 (0)	
	(*ptrType)Key Lines: 1 to 1 (0)	
	(*ptrType)Kind Lines: 1 to 1 (0)	
	(*ptrType)Len Lines: 1 to 1 (0)	
	(*ptrType)Method Lines: 1 to 1 (0)	
	(*ptrType)MethodByName Lines: 1 to 1 (0)	
	(*ptrType)Name Lines: 1 to 1 (0)	
	(*ptrType)NumField Lines: 1 to 1 (0)	
	(*ptrType)NumIn Lines: 1 to 1 (0)	
	(*ptrType)NumMethod Lines: 1 to 1 (0)	
	(*ptrType)NumOut Lines: 1 to 1 (0)	
	(*ptrType)Out Lines: 1 to 1 (0)	
	(*ptrType)PkgPath Lines: 1 to 1 (0)	
	(*ptrType)Size Lines: 1 to 1 (0)	
	(*ptrType)String Lines: 1 to 1 (0)	
	(*ptrType)common Lines: 1 to 1 (0)	
	(*ptrType)uncommon Lines: 1 to 1 (0)	
File: asm_amd64.s	
	methodValueCall Lines: 27 to 36 (9)	
File: chan.go	
	chanlen Lines: 685 to 726 (41)	
File: iface.go	
	ifaceE2I Lines: 503 to 512 (9)	
File: makefunc.go	
	makeMethodValue Lines: 95 to 480 (385)	
File: malloc.go	
	unsafe_New Lines: 1169 to 1179 (10)	
File: map.go	
	mapiterinit Lines: 1329 to 1336 (7)	
	mapiternext Lines: 1336 to 1342 (6)	
	mapiterkey Lines: 1342 to 1347 (5)	
	mapiterelem Lines: 1347 to 1352 (5)	
	maplen Lines: 1352 to 1353 (1)	
File: mbarrier.go	
	typedmemmove Lines: 177 to 197 (20)	
	typedmemmovepartial Lines: 197 to 225 (28)	
	typedmemclr Lines: 327 to 345 (18)	
File: runtime1.go	
	typelinks Lines: 468 to 481 (13)	
	resolveNameOff Lines: 481 to 487 (6)	
	resolveTypeOff Lines: 487 to 493 (6)	
	resolveTextOff Lines: 493 to 500 (7)	
	addReflectOff Lines: 512 to 515 (3)	
File: stubs.go	
	memmove Lines: 101 to 110 (9)	
File: type.go	
	nametagLen Lines: 480 to 499 (19)	
	nametag Lines: 499 to 511 (12)	
	namepkgPath Lines: 511 to 527 (16)	
	newName Lines: 527 to 588 (61)	
	KindString Lines: 588 to 695 (107)	
	(*rtype)uncommon Lines: 695 to 752 (57)	
	(*rtype)String Lines: 752 to 760 (8)	
	(*rtype)Size Lines: 760 to 762 (2)	
	(*rtype)Bits Lines: 762 to 773 (11)	
	(*rtype)Align Lines: 773 to 775 (2)	
	(*rtype)FieldAlign Lines: 775 to 777 (2)	
	(*rtype)Kind Lines: 777 to 781 (4)	
	(*rtype)common Lines: 781 to 783 (2)	
	(*rtype)exportedMethods Lines: 783 to 791 (8)	
	(*rtype)NumMethod Lines: 791 to 799 (8)	
	(*rtype)Method Lines: 799 to 833 (34)	
	(*rtype)MethodByName Lines: 833 to 851 (18)	
	(*rtype)PkgPath Lines: 851 to 866 (15)	
	(*rtype)Name Lines: 866 to 878 (12)	
	(*rtype)ChanDir Lines: 878 to 886 (8)	
	(*rtype)IsVariadic Lines: 886 to 894 (8)	
	(*rtype)Elem Lines: 894 to 915 (21)	
	(*rtype)Field Lines: 915 to 923 (8)	
	(*rtype)FieldByIndex Lines: 923 to 931 (8)	
	(*rtype)FieldByName Lines: 931 to 939 (8)	
	(*rtype)FieldByNameFunc Lines: 939 to 947 (8)	
	(*rtype)In Lines: 947 to 955 (8)	
	(*rtype)Key Lines: 955 to 963 (8)	
	(*rtype)Len Lines: 963 to 971 (8)	
	(*rtype)NumField Lines: 971 to 979 (8)	
	(*rtype)NumIn Lines: 979 to 987 (8)	
	(*rtype)NumOut Lines: 987 to 995 (8)	
	(*rtype)Out Lines: 995 to 1037 (42)	
	ChanDirString Lines: 1037 to 1050 (13)	
	(*interfaceType)Method Lines: 1050 to 1072 (22)	
	(*interfaceType)MethodByName Lines: 1072 to 1183 (111)	
	(*structType)Field Lines: 1183 to 1214 (31)	
	(*structType)FieldByIndex Lines: 1214 to 1237 (23)	
	(*structType)FieldByNameFunc Lines: 1237 to 1343 (106)	
	(*structType)FieldByName Lines: 1343 to 1366 (23)	
	(*structType).FieldByNamefunc1 Lines: 1360 to 2021 (661)	
	TypeOf Lines: 1366 to 1379 (13)	
	(*rtype)ptrTo Lines: 1379 to 1424 (45)	
	fnv1 Lines: 1424 to 1430 (6)	
	(*rtype)Implements Lines: 1430 to 1440 (10)	
	(*rtype)AssignableTo Lines: 1440 to 1448 (8)	
	(*rtype)ConvertibleTo Lines: 1448 to 1457 (9)	
	(*rtype)Comparable Lines: 1457 to 1461 (4)	
	implements Lines: 1461 to 1549 (88)	
	specialChannelAssignability Lines: 1549 to 1562 (13)	
	directlyAssignable Lines: 1562 to 1582 (20)	
	haveIdenticalType Lines: 1582 to 1594 (12)	
	haveIdenticalUnderlyingType Lines: 1594 to 1712 (118)	
	typesByString Lines: 1712 to 1932 (220)	
	FuncOf Lines: 1932 to 2045 (113)	
	FuncOffunc1 Lines: 2021 to 3051 (1030)	
	funcStr Lines: 2045 to 2990 (945)	
	funcLayout Lines: 2990 to 3084 (94)	
	funcLayoutfunc1 Lines: 3051 to 3052 (1)	
	addTypeBits Lines: 3084 to 3116 (32)	
File: value.go	
	packEface Lines: 103 to 162 (59)	
	(*ValueError)Error Lines: 162 to 171 (9)	
	methodName Lines: 171 to 238 (67)	
	flagmustBeAssignableSlow Lines: 238 to 265 (27)	
	ValueBool Lines: 265 to 272 (7)	
	ValueBytes Lines: 272 to 283 (11)	
	Valuerunes Lines: 283 to 612 (329)	
	methodReceiver Lines: 612 to 686 (74)	
	callMethod Lines: 686 to 788 (102)	
	ValueElem Lines: 788 to 825 (37)	
	ValueField Lines: 825 to 915 (90)	
	init Lines: 911 to 911 (0)	
	ValueIndex Lines: 915 to 996 (81)	
	valueInterface Lines: 996 to 1118 (122)	
	ValueKind Lines: 1118 to 1123 (5)	
	ValueLen Lines: 1123 to 1217 (94)	
	(*MapIter)Key Lines: 1217 to 1231 (14)	
	(*MapIter)Value Lines: 1231 to 1247 (16)	
	(*MapIter)Next Lines: 1247 to 1275 (28)	
	ValueMapRange Lines: 1275 to 1282 (7)	
	copyVal Lines: 1282 to 1314 (32)	
	ValueNumMethod Lines: 1314 to 1345 (31)	
	ValueNumField Lines: 1345 to 1429 (84)	
	ValuePointer Lines: 1429 to 1550 (121)	
	ValueSetBytes Lines: 1550 to 1561 (11)	
	ValuesetRunes Lines: 1561 to 1709 (148)	
	ValueSetString Lines: 1709 to 1718 (9)	
	ValueSlice Lines: 1718 to 1835 (117)	
	ValueString Lines: 1835 to 1869 (34)	
	ValueType Lines: 1869 to 2335 (466)	
	Zero Lines: 2335 to 2349 (14)	
	New Lines: 2349 to 2422 (73)	
	convertOp Lines: 2422 to 2510 (88)	
	makeInt Lines: 2510 to 2528 (18)	
	makeFloat Lines: 2528 to 2542 (14)	
	makeComplex Lines: 2542 to 2554 (12)	
	makeString Lines: 2554 to 2561 (7)	
	makeBytes Lines: 2561 to 2568 (7)	
	makeRunes Lines: 2568 to 2581 (13)	
	cvtInt Lines: 2581 to 2586 (5)	
	cvtUint Lines: 2586 to 2591 (5)	
	cvtFloatInt Lines: 2591 to 2596 (5)	
	cvtFloatUint Lines: 2596 to 2601 (5)	
	cvtIntFloat Lines: 2601 to 2606 (5)	
	cvtUintFloat Lines: 2606 to 2611 (5)	
	cvtFloat Lines: 2611 to 2616 (5)	
	cvtComplex Lines: 2616 to 2621 (5)	
	cvtIntString Lines: 2621 to 2626 (5)	
	cvtUintString Lines: 2626 to 2631 (5)	
	cvtBytesString Lines: 2631 to 2636 (5)	
	cvtStringBytes Lines: 2636 to 2641 (5)	
	cvtRunesString Lines: 2641 to 2646 (5)	
	cvtStringRunes Lines: 2646 to 2651 (5)	
	cvtDirect Lines: 2651 to 2666 (15)	
	cvtT2I Lines: 2666 to 2678 (12)	
	cvtI2I Lines: 2678 to 2679 (1)	
Package runtime: internal/bytealg
File: <autogenerated>	
	(*waitReason)String Lines: 1 to 1002 (1001)	
	(*boundsError)Error Lines: 1 to 1 (0)	
	(*errorString)Error Lines: 1 to 77 (76)	
	(*plainError)Error Lines: 1 to 1 (0)	
File: alg.go	
	memhash128 Lines: 49 to 71 (22)	
	strhashFallback Lines: 71 to 81 (10)	
	f32hash Lines: 81 to 93 (12)	
	f64hash Lines: 93 to 105 (12)	
	c64hash Lines: 105 to 110 (5)	
	c128hash Lines: 110 to 115 (5)	
	interhash Lines: 115 to 136 (21)	
	nilinterhash Lines: 136 to 161 (25)	
	typehash Lines: 161 to 211 (50)	
	memequal0 Lines: 211 to 214 (3)	
	memequal8 Lines: 214 to 217 (3)	
	memequal16 Lines: 217 to 220 (3)	
	memequal32 Lines: 220 to 223 (3)	
	memequal64 Lines: 223 to 226 (3)	
	memequal128 Lines: 226 to 229 (3)	
	f32equal Lines: 229 to 232 (3)	
	f64equal Lines: 232 to 235 (3)	
	c64equal Lines: 235 to 238 (3)	
	c128equal Lines: 238 to 240 (2)	
	strequal Lines: 240 to 243 (3)	
	interequal Lines: 243 to 248 (5)	
	nilinterequal Lines: 248 to 253 (5)	
	efaceeq Lines: 253 to 269 (16)	
	ifaceeq Lines: 269 to 321 (52)	
	alginit Lines: 321 to 328 (7)	
File: asm.s	
	skipPleaseUseCallersFrames Lines: 34 to 34 (0)	
File: asm_amd64.s	
	rt0_go Lines: 89 to 244 (155)	
	asminit Lines: 244 to 272 (28)	
	gogo Lines: 272 to 294 (22)	
	mcall Lines: 294 to 330 (36)	
	systemstack_switch Lines: 330 to 334 (4)	
	systemstack Lines: 334 to 410 (76)	
	morestack Lines: 410 to 455 (45)	
	morestack_noctxt Lines: 455 to 472 (17)	
	reflectcall Lines: 472 to 530 (58)	
	call32 Lines: 539 to 540 (1)	
	call64 Lines: 540 to 541 (1)	
	call128 Lines: 541 to 542 (1)	
	call256 Lines: 542 to 543 (1)	
	call512 Lines: 543 to 544 (1)	
	call1024 Lines: 544 to 545 (1)	
	call2048 Lines: 545 to 546 (1)	
	call4096 Lines: 546 to 547 (1)	
	call8192 Lines: 547 to 548 (1)	
	call16384 Lines: 548 to 549 (1)	
	call32768 Lines: 549 to 550 (1)	
	call65536 Lines: 550 to 551 (1)	
	call131072 Lines: 551 to 552 (1)	
	call262144 Lines: 552 to 553 (1)	
	call524288 Lines: 553 to 554 (1)	
	call1048576 Lines: 554 to 555 (1)	
	call2097152 Lines: 555 to 556 (1)	
	call4194304 Lines: 556 to 557 (1)	
	call8388608 Lines: 557 to 558 (1)	
	call16777216 Lines: 558 to 559 (1)	
	call33554432 Lines: 559 to 560 (1)	
	call67108864 Lines: 560 to 561 (1)	
	call134217728 Lines: 561 to 562 (1)	
	call268435456 Lines: 562 to 563 (1)	
	call536870912 Lines: 563 to 564 (1)	
	call1073741824 Lines: 564 to 567 (3)	
	procyield Lines: 567 to 578 (11)	
	publicationBarrier Lines: 578 to 587 (9)	
	jmpdefer Lines: 587 to 598 (11)	
	asmcgocall Lines: 617 to 835 (218)	
	setg Lines: 835 to 853 (18)	
	abort Lines: 857 to 864 (7)	
	stackcheck Lines: 864 to 875 (11)	
	cputicks Lines: 875 to 891 (16)	
	memhash Lines: 891 to 902 (11)	
	strhash Lines: 902 to 917 (15)	
	memhash32 Lines: 1245 to 1260 (15)	
	memhash64 Lines: 1260 to 1311 (51)	
	checkASM Lines: 1311 to 1356 (45)	
	return0 Lines: 1356 to 1373 (17)	
	goexit Lines: 1373 to 1394 (21)	
	gcWriteBarrier Lines: 1394 to 1512 (118)	
	debugCallV1 Lines: 1512 to 1646 (134)	
	debugCallPanicked Lines: 1660 to 1676 (16)	
	panicIndex Lines: 1676 to 1680 (4)	
	panicIndexU Lines: 1680 to 1684 (4)	
	panicSliceAlen Lines: 1684 to 1688 (4)	
	panicSliceAlenU Lines: 1688 to 1692 (4)	
	panicSliceAcap Lines: 1692 to 1696 (4)	
	panicSliceAcapU Lines: 1696 to 1700 (4)	
	panicSliceB Lines: 1700 to 1704 (4)	
	panicSliceBU Lines: 1704 to 1708 (4)	
	panicSlice3Alen Lines: 1708 to 1712 (4)	
	panicSlice3AlenU Lines: 1712 to 1732 (20)	
	panicSlice3C Lines: 1732 to 1734 (2)	
File: atomic_pointer.go	
	atomicwb Lines: 21 to 31 (10)	
	atomicstorep Lines: 31 to 47 (16)	
File: cgo_mmap.go	
	mmap Lines: 28 to 47 (19)	
	mmapfunc1 Lines: 36 to 49 (13)	
	munmap Lines: 47 to 53 (6)	
	munmapfunc1 Lines: 49 to 65 (16)	
File: cgo_sigaction.go	
	sigaction Lines: 20 to 99 (79)	
	sigactionfunc1 Lines: 65 to 67 (2)	
File: cgocall.go	
	cgocall Lines: 99 to 639 (540)	
	cgoIsGoPointer Lines: 639 to 641 (2)	
File: cgocheck.go	
	cgoCheckWriteBarrier Lines: 25 to 66 (41)	
	cgoCheckWriteBarrierfunc1 Lines: 53 to 144 (91)	
	cgoCheckMemmove Lines: 66 to 85 (19)	
	cgoCheckSliceCopy Lines: 85 to 107 (22)	
	cgoCheckTypedBlock Lines: 107 to 170 (63)	
	cgoCheckTypedBlockfunc1 Lines: 144 to 193 (49)	
	cgoCheckBits Lines: 170 to 205 (35)	
	cgoCheckUsingType Lines: 205 to 224 (19)	
File: chan.go	
	makechan Lines: 71 to 126 (55)	
	chansend1 Lines: 126 to 142 (16)	
	chansend Lines: 142 to 270 (128)	
	chansendfunc1 Lines: 193 to 479 (286)	
	send Lines: 270 to 313 (43)	
	sendDirect Lines: 313 to 326 (13)	
	recvDirect Lines: 326 to 335 (9)	
	closechan Lines: 335 to 406 (71)	
	chanrecv1 Lines: 406 to 422 (16)	
	chanrecv Lines: 422 to 556 (134)	
	chanrecvfunc1 Lines: 479 to 479 (0)	
	recv Lines: 556 to 599 (43)	
	chanparkcommit Lines: 599 to 685 (86)	
	(*waitq)dequeue Lines: 726 to 730 (4)	
File: compare_amd64.s	
	cmpstring Lines: 17 to 31 (14)	
File: cpuflags_amd64.go	
	init0 Lines: 15 to 91 (76)	
File: cpuprof.go	
	(*cpuProfile)add Lines: 91 to 121 (30)	
	(*cpuProfile)addNonGo Lines: 121 to 147 (26)	
	(*cpuProfile)addExtra Lines: 147 to 151 (4)	
File: debug.go	
	GOMAXPROCS Lines: 17 to 26 (9)	
File: debugcall.go	
	debugCallCheck Lines: 26 to 100 (74)	
	debugCallCheckfunc1 Lines: 42 to 106 (64)	
	debugCallWrap Lines: 100 to 114 (14)	
	debugCallWrapfunc1 Lines: 106 to 1046 (940)	
File: duff_amd64.s	
	duffzero Lines: 8 to 107 (99)	
	duffcopy Lines: 107 to 427 (320)	
File: env_posix.go	
	gogetenv Lines: 11 to 30 (19)	
File: equal_amd64.s	
	memequal Lines: 10 to 23 (13)	
	memequal_varlen Lines: 23 to 39 (16)	
File: error.go	
	(*TypeAssertionError)Error Lines: 30 to 60 (30)	
	itoa Lines: 60 to 76 (16)	
	errorStringError Lines: 76 to 88 (12)	
	plainErrorError Lines: 88 to 148 (60)	
	appendIntStr Lines: 148 to 158 (10)	
	boundsErrorError Lines: 158 to 196 (38)	
	printany Lines: 196 to 243 (47)	
	panicwrap Lines: 243 to 251 (8)	
File: extern.go	
	Caller Lines: 185 to 221 (36)	
	GOROOT Lines: 221 to 226 (5)	
File: float.go	
	init Lines: 9 to 34 (25)	
	float64frombits Lines: 52 to 52 (0)	
File: hash64.go	
	memhashFallback Lines: 24 to 82 (58)	
	memhash32Fallback Lines: 82 to 94 (12)	
	memhash64Fallback Lines: 94 to 100 (6)	
File: iface.go	
	getitab Lines: 33 to 100 (67)	
	(*itabTableType)find Lines: 100 to 121 (21)	
	itabAdd Lines: 121 to 162 (41)	
	(*itabTableType)add-fm Lines: 158 to 158 (0)	
	(*itabTableType)add Lines: 162 to 191 (29)	
	(*itab)init Lines: 191 to 245 (54)	
	itabsinit Lines: 245 to 259 (14)	
	panicdottypeE Lines: 259 to 265 (6)	
	panicdottypeI Lines: 265 to 317 (52)	
	convT2E Lines: 317 to 343 (26)	
	convT32 Lines: 343 to 353 (10)	
	convT64 Lines: 353 to 363 (10)	
	convTstring Lines: 363 to 373 (10)	
	convTslice Lines: 373 to 384 (11)	
	convT2Enoptr Lines: 384 to 398 (14)	
	convT2I Lines: 398 to 428 (30)	
	convI2I Lines: 428 to 459 (31)	
	assertI2I2 Lines: 459 to 476 (17)	
	assertE2I Lines: 476 to 487 (11)	
	assertE2I2 Lines: 487 to 503 (16)	
	iterate_itabs Lines: 512 to 516 (4)	
File: lfstack.go	
	(*lfstack)push Lines: 25 to 42 (17)	
	(*lfstack)pop Lines: 42 to 61 (19)	
	lfnodeValidate Lines: 61 to 65 (4)	
File: lock_futex.go	
	lock Lines: 46 to 106 (60)	
	unlock Lines: 106 to 130 (24)	
	notewakeup Lines: 130 to 139 (9)	
	notesleep Lines: 139 to 164 (25)	
	notetsleep_internal Lines: 164 to 210 (46)	
	notetsleep Lines: 210 to 221 (11)	
	notetsleepg Lines: 221 to 415 (194)	
File: malloc.go	
	mallocinit Lines: 415 to 617 (202)	
	(*mheap)sysAlloc Lines: 617 to 781 (164)	
	sysReserveAligned Lines: 781 to 858 (77)	
	(*mcache)nextFree Lines: 858 to 891 (33)	
	mallocgc Lines: 891 to 1136 (245)	
	mallocgcfunc1 Lines: 1046 to 1290 (244)	
	largeAlloc Lines: 1136 to 1164 (28)	
	newobject Lines: 1164 to 1169 (5)	
	newarray Lines: 1179 to 1195 (16)	
	profilealloc Lines: 1195 to 1220 (25)	
	fastexprand Lines: 1220 to 1288 (68)	
	persistentalloc Lines: 1288 to 1299 (11)	
	persistentallocfunc1 Lines: 1290 to 1292 (2)	
	persistentalloc1 Lines: 1299 to 1369 (70)	
	inPersistentAlloc Lines: 1369 to 1393 (24)	
	(*linearAlloc)alloc Lines: 1393 to 1396 (3)	
File: map.go	
	(*hmap)incrnoverflow Lines: 230 to 245 (15)	
	(*hmap)newoverflow Lines: 245 to 292 (47)	
	makemap_small Lines: 292 to 303 (11)	
	makemap Lines: 303 to 344 (41)	
	makeBucketArray Lines: 344 to 452 (108)	
	mapaccess2 Lines: 452 to 511 (59)	
	mapaccessK Lines: 511 to 571 (60)	
	mapassign Lines: 571 to 797 (226)	
	mapiterinit Lines: 797 to 846 (49)	
	mapiternext Lines: 846 to 1017 (171)	
	hashGrow Lines: 1017 to 1104 (87)	
	growWork Lines: 1104 to 1128 (24)	
	evacuate Lines: 1128 to 1242 (114)	
	advanceEvacuationMark Lines: 1242 to 1329 (87)	
File: map_fast32.go	
	mapaccess1_fast32 Lines: 12 to 52 (40)	
	mapaccess2_fast32 Lines: 52 to 92 (40)	
	mapassign_fast32 Lines: 92 to 353 (261)	
	growWork_fast32 Lines: 353 to 364 (11)	
	evacuate_fast32 Lines: 364 to 397 (33)	
File: map_fast64.go	
	mapaccess1_fast64 Lines: 12 to 52 (40)	
	mapaccess2_fast64 Lines: 52 to 182 (130)	
	mapassign_fast64ptr Lines: 182 to 353 (171)	
	growWork_fast64 Lines: 353 to 364 (11)	
	evacuate_fast64 Lines: 364 to 397 (33)	
File: map_faststr.go	
	mapaccess2_faststr Lines: 107 to 202 (95)	
	mapassign_faststr Lines: 202 to 382 (180)	
	growWork_faststr Lines: 382 to 393 (11)	
	evacuate_faststr Lines: 393 to 426 (33)	
File: mbarrier.go	
	typedmemmove Lines: 156 to 177 (21)	
	reflectcallmove Lines: 225 to 233 (8)	
	typedslicecopy Lines: 233 to 319 (86)	
	typedmemclr Lines: 319 to 327 (8)	
	memclrHasPointers Lines: 345 to 348 (3)	
File: mbitmap.go	
	(*mspan)refillAllocCache Lines: 178 to 195 (17)	
	(*mspan)nextFreeIndex Lines: 195 to 608 (413)	
	badPointer Lines: 357 to 397 (40)	
	findObject Lines: 397 to 468 (71)	
	heapBitsnextArena Lines: 468 to 493 (25)	
	heapBitsforward Lines: 493 to 519 (26)	
	heapBitsforwardOrBoundary Lines: 519 to 608 (89)	
	bulkBarrierPreWrite Lines: 608 to 676 (68)	
	bulkBarrierPreWriteSrcOnly Lines: 676 to 704 (28)	
	bulkBarrierBitmap Lines: 704 to 754 (50)	
	typeBitsBulkBarrier Lines: 754 to 802 (48)	
	heapBitsinitSpan Lines: 802 to 831 (29)	
	heapBitsinitCheckmarkSpan Lines: 831 to 854 (23)	
	heapBitsclearCheckmarkSpan Lines: 854 to 910 (56)	
	(*mspan)countAlloc Lines: 910 to 947 (37)	
	heapBitsSetType Lines: 947 to 1529 (582)	
	heapBitsSetTypeGCProg Lines: 1529 to 1608 (79)	
	progToPointerMask Lines: 1608 to 1641 (33)	
	runGCProg Lines: 1641 to 1923 (282)	
	materializeGCProg Lines: 1923 to 1926 (3)	
File: mcache.go	
	allocmcache Lines: 85 to 100 (15)	
	allocmcachefunc1 Lines: 87 to 101 (14)	
	freemcache Lines: 100 to 122 (22)	
	freemcachefunc1 Lines: 101 to 368 (267)	
	(*mcache)refill Lines: 122 to 154 (32)	
	(*mcache)releaseAll Lines: 154 to 170 (16)	
	(*mcache)prepareForSweep Lines: 170 to 183 (13)	
File: mcentral.go	
	(*mcentral)cacheSpan Lines: 40 to 150 (110)	
	(*mcentral)uncacheSpan Lines: 150 to 209 (59)	
	(*mcentral)freeSpan Lines: 209 to 251 (42)	
	(*mcentral)grow Lines: 251 to 252 (1)	
File: mem_linux.go	
	sysAlloc Lines: 20 to 39 (19)	
	sysUnused Lines: 39 to 131 (92)	
	sysHugePage Lines: 131 to 147 (16)	
	sysFree Lines: 147 to 164 (17)	
	sysMap Lines: 164 to 169 (5)	
File: memclr_amd64.s	
	memclrNoHeapPointers Lines: 14 to 36 (22)	
File: memmove_amd64.s	
	memmove Lines: 36 to 525 (489)	
File: mfinal.go	
	queuefinalizer Lines: 77 to 136 (59)	
	wakefing Lines: 136 to 153 (17)	
	createfing Lines: 153 to 161 (8)	
	runfinq Lines: 161 to 309 (148)	
	SetFinalizer Lines: 309 to 318 (9)	
	SetFinalizerfunc1 Lines: 368 to 417 (49)	
	SetFinalizerfunc2 Lines: 417 to 419 (2)	
File: mfixalloc.go	
	(*fixalloc)alloc Lines: 64 to 172 (108)	
File: mgc.go	
	gcinit Lines: 172 to 196 (24)	
	readgogc Lines: 196 to 211 (15)	
	gcenable Lines: 211 to 222 (11)	
	setGCPercentfunc1 Lines: 224 to 1308 (1084)	
	(*gcControllerState)startCycle Lines: 412 to 489 (77)	
	(*gcControllerState)revise Lines: 489 to 559 (70)	
	(*gcControllerState)endCycle Lines: 559 to 634 (75)	
	(*gcControllerState)enlistWorker Lines: 634 to 674 (40)	
	(*gcControllerState)findRunnableGCWorker Lines: 674 to 737 (63)	
	pollFractionalWorkerExit Lines: 737 to 763 (26)	
	gcSetTriggerRatio Lines: 763 to 1130 (367)	
	gcWaitOnMark Lines: 1130 to 1221 (91)	
	gcStart Lines: 1221 to 1422 (201)	
	gcStartfunc1 Lines: 1308 to 1365 (57)	
	gcStartfunc2 Lines: 1365 to 1448 (83)	
	gcMarkDone Lines: 1422 to 1605 (183)	
	gcMarkDonefunc1 Lines: 1441 to 1560 (119)	
	gcMarkDone.func11 Lines: 1448 to 1470 (22)	
	gcMarkDonefunc2 Lines: 1560 to 1571 (11)	
	gcMarkDonefunc3 Lines: 1571 to 1627 (56)	
	gcMarkTermination Lines: 1605 to 1808 (203)	
	gcMarkTerminationfunc1 Lines: 1627 to 1638 (11)	
	gcMarkTerminationfunc2 Lines: 1638 to 1727 (89)	
	gcMarkTerminationfunc3 Lines: 1727 to 1746 (19)	
	gcMarkTerminationfunc4 Lines: 1745 to 1870 (125)	
	gcMarkTermination.func41 Lines: 1746 to 1748 (2)	
	gcBgMarkStartWorkers Lines: 1808 to 1836 (28)	
	gcBgMarkWorker Lines: 1836 to 2025 (189)	
	gcBgMarkWorkerfunc1 Lines: 1870 to 1919 (49)	
	gcBgMarkWorkerfunc2 Lines: 1919 to 1930 (11)	
	gcMark Lines: 2025 to 2115 (90)	
	gcSweep Lines: 2115 to 2176 (61)	
	gcResetMarkState Lines: 2176 to 2207 (31)	
	clearpools Lines: 2211 to 2249 (38)	
	itoaDiv Lines: 2249 to 2266 (17)	
	fmtNSAsMS Lines: 2266 to 2274 (8)	
File: mgcmark.go	
	gcMarkRootPrepare Lines: 60 to 105 (45)	
	gcMarkRootCheck Lines: 105 to 141 (36)	
	markroot Lines: 141 to 241 (100)	
	markrootfunc1 Lines: 199 to 441 (242)	
	markrootBlock Lines: 241 to 269 (28)	
	markrootFreeGStacks Lines: 269 to 299 (30)	
	markrootSpans Lines: 299 to 382 (83)	
	gcAssistAlloc Lines: 382 to 497 (115)	
	gcAssistAllocfunc1 Lines: 441 to 735 (294)	
	gcAssistAlloc1 Lines: 497 to 571 (74)	
	gcWakeAllAssists Lines: 571 to 584 (13)	
	gcParkAssist Lines: 584 to 625 (41)	
	gcFlushBgCredit Lines: 625 to 685 (60)	
	scanstack Lines: 685 to 853 (168)	
	scanstackfunc1 Lines: 735 to 737 (2)	
	scanframeworker Lines: 853 to 967 (114)	
	gcDrain Lines: 967 to 1079 (112)	
	gcDrainN Lines: 1079 to 1151 (72)	
	scanblock Lines: 1151 to 1189 (38)	
	scanobject Lines: 1189 to 1291 (102)	
	scanConservative Lines: 1291 to 1382 (91)	
	shade Lines: 1382 to 1396 (14)	
	greyobject Lines: 1396 to 1468 (72)	
	gcDumpObject Lines: 1468 to 1520 (52)	
	gcmarknewobject Lines: 1520 to 1533 (13)	
	gcMarkTinyAllocs Lines: 1533 to 1569 (36)	
	initCheckmarks Lines: 1569 to 1578 (9)	
	clearCheckmarks Lines: 1578 to 1580 (2)	
File: mgcscavenge.go	
	gcPaceScavenger Lines: 111 to 168 (57)	
	wakeScavenger Lines: 168 to 201 (33)	
	wakeScavengerfunc1 Lines: 186 to 232 (46)	
	scavengeSleep Lines: 201 to 225 (24)	
	bgscavenge Lines: 225 to 349 (124)	
	bgscavengefunc1 Lines: 232 to 264 (32)	
	bgscavengefunc2 Lines: 264 to 479 (215)	
	(*pageAlloc)scavenge Lines: 349 to 367 (18)	
	printScavTrace Lines: 367 to 386 (19)	
	(*pageAlloc)resetScavengeAddr Lines: 386 to 413 (27)	
	(*pageAlloc)scavengeOne Lines: 413 to 574 (161)	
	(*pageAlloc).scavengeOnefunc3 Lines: 479 to 484 (5)	
	(*pageAlloc)scavengeRangeLocked Lines: 574 to 603 (29)	
	fillAligned Lines: 603 to 659 (56)	
	(*pallocData)hasScavengeCandidate Lines: 659 to 706 (47)	
	(*pallocData)findScavengeCandidate Lines: 706 to 709 (3)	
File: mgcstack.go	
	(*stackScanState)putPtr Lines: 208 to 243 (35)	
	(*stackScanState)getPtr Lines: 243 to 276 (33)	
	(*stackScanState)addObject Lines: 276 to 317 (41)	
	binarySearchTree Lines: 317 to 338 (21)	
	(*stackScanState)findObject Lines: 338 to 342 (4)	
File: mgcsweep.go	
	finishsweep_m Lines: 51 to 64 (13)	
	bgsweep Lines: 64 to 95 (31)	
	sweepone Lines: 95 to 172 (77)	
	(*mspan)ensureSwept Lines: 172 to 206 (34)	
	(*mspan)sweep Lines: 206 to 420 (214)	
	deductSweepCredit Lines: 420 to 456 (36)	
	clobberfree Lines: 456 to 457 (1)	
File: mgcsweepbuf.go	
	(*gcSweepBuf)push Lines: 56 to 154 (98)	
	(*gcSweepBuf)block Lines: 154 to 158 (4)	
File: mgcwork.go	
	(*gcWork)init Lines: 116 to 176 (60)	
	(*gcWork)put Lines: 176 to 231 (55)	
	(*gcWork)putBatch Lines: 231 to 269 (38)	
	(*gcWork)tryGet Lines: 269 to 318 (49)	
	(*gcWork)dispose Lines: 318 to 354 (36)	
	(*gcWork)balance Lines: 354 to 403 (49)	
	(*workbuf)checknonempty Lines: 403 to 409 (6)	
	(*workbuf)checkempty Lines: 409 to 418 (9)	
	getempty Lines: 418 to 469 (51)	
	getemptyfunc1 Lines: 439 to 534 (95)	
	putempty Lines: 469 to 478 (9)	
	putfull Lines: 478 to 486 (8)	
	trygetfull Lines: 486 to 496 (10)	
	handoff Lines: 496 to 512 (16)	
	prepareFreeWorkbufs Lines: 512 to 527 (15)	
	freeSomeWbufs Lines: 527 to 547 (20)	
	freeSomeWbufsfunc1 Lines: 534 to 865 (331)	
File: mheap.go	
	recordspan Lines: 468 to 608 (140)	
	inHeapOrStack Lines: 608 to 628 (20)	
	spanOfHeap Lines: 608 to 672 (64)	
	markBitsForAddr Lines: 608 to 628 (20)	
	(*mheap)init Lines: 672 to 703 (31)	
	(*mheap)reclaim Lines: 703 to 792 (89)	
	(*mheap)reclaimChunk Lines: 792 to 860 (68)	
	(*mheap)alloc Lines: 860 to 897 (37)	
	(*mheap).allocfunc1 Lines: 865 to 1344 (479)	
	(*mheap)allocManual Lines: 897 to 903 (6)	
	(*mheap)setSpans Lines: 903 to 927 (24)	
	(*mheap)allocNeedsZero Lines: 927 to 1015 (88)	
	(*mheap)allocMSpanLocked Lines: 1015 to 1075 (60)	
	(*mheap)allocSpan Lines: 1075 to 1276 (201)	
	(*mheap)grow Lines: 1276 to 1343 (67)	
	(*mheap)freeSpan Lines: 1343 to 1377 (34)	
	(*mheap).freeSpanfunc1 Lines: 1344 to 1359 (15)	
	(*mheap)freeManual Lines: 1377 to 1386 (9)	
	(*mheap)freeSpanLocked Lines: 1386 to 1478 (92)	
	(*mSpanList)remove Lines: 1478 to 1503 (25)	
	(*mSpanList)insert Lines: 1503 to 1521 (18)	
	(*mSpanList)insertBack Lines: 1521 to 1541 (20)	
	(*mSpanList)takeAll Lines: 1541 to 1585 (44)	
	addspecial Lines: 1585 to 1633 (48)	
	removespecial Lines: 1633 to 1684 (51)	
	addfinalizer Lines: 1684 to 1721 (37)	
	removefinalizer Lines: 1721 to 1740 (19)	
	setprofilebucket Lines: 1740 to 1753 (13)	
	freespecial Lines: 1753 to 1831 (78)	
	newMarkBits Lines: 1831 to 1887 (56)	
	newAllocBits Lines: 1887 to 1905 (18)	
	nextMarkBitArenaEpoch Lines: 1905 to 1927 (22)	
	newArenaMayUnlock Lines: 1927 to 1933 (6)	
File: mpagealloc.go	
	(*pageAlloc)init Lines: 282 to 341 (59)	
	(*pageAlloc)grow Lines: 341 to 405 (64)	
	(*pageAlloc)update Lines: 405 to 491 (86)	
	(*pageAlloc)allocRange Lines: 491 to 535 (44)	
	(*pageAlloc)find Lines: 535 to 754 (219)	
	(*pageAlloc).findfunc1 Lines: 592 to 603 (11)	
	(*pageAlloc)alloc Lines: 754 to 809 (55)	
	(*pageAlloc)free Lines: 809 to 906 (97)	
	mergeSummaries Lines: 906 to 911 (5)	
File: mpagealloc_64bit.go	
	(*pageAlloc)sysInit Lines: 70 to 99 (29)	
	(*pageAlloc)sysGrow Lines: 99 to 102 (3)	
	(*pageAlloc).sysGrowfunc1 Lines: 108 to 116 (8)	
	(*pageAlloc).sysGrowfunc2 Lines: 116 to 129 (13)	
	(*pageAlloc).sysGrowfunc3 Lines: 129 to 356 (227)	
File: mpagecache.go	
	(*pageCache)alloc Lines: 38 to 58 (20)	
	(*pageCache)allocN Lines: 58 to 75 (17)	
	(*pageCache)flush Lines: 75 to 106 (31)	
	(*pageAlloc)allocToCache Lines: 106 to 114 (8)	
File: mpallocbits.go	
	(*pageBits)setRange Lines: 30 to 55 (25)	
	(*pageBits)setAll Lines: 55 to 66 (11)	
	(*pageBits)clearRange Lines: 66 to 91 (25)	
	(*pageBits)clearAll Lines: 91 to 98 (7)	
	(*pageBits)popcntRange Lines: 98 to 167 (69)	
	(*pallocBits)summarize Lines: 167 to 206 (39)	
	(*pallocBits)find Lines: 206 to 221 (15)	
	(*pallocBits)find1 Lines: 221 to 241 (20)	
	(*pallocBits)findSmallN Lines: 241 to 280 (39)	
	(*pallocBits)findLargeN Lines: 280 to 353 (73)	
	findBitRange64 Lines: 353 to 376 (23)	
	(*pallocData)allocRange Lines: 376 to 384 (8)	
	(*pallocData)allocAll Lines: 384 to 388 (4)	
File: mprof.go	
	newBucket Lines: 162 to 187 (25)	
	(*bucket)mp Lines: 187 to 196 (9)	
	(*bucket)bp Lines: 196 to 205 (9)	
	stkbucket Lines: 205 to 260 (55)	
	eqslice Lines: 260 to 279 (19)	
	mProf_NextCycle Lines: 279 to 296 (17)	
	mProf_Flush Lines: 296 to 305 (9)	
	mProf_FlushLocked Lines: 305 to 340 (35)	
	mProf_Malloc Lines: 340 to 362 (22)	
	mProf_Mallocfunc1 Lines: 356 to 831 (475)	
	mProf_Free Lines: 362 to 397 (35)	
	blockevent Lines: 397 to 407 (10)	
	blocksampled Lines: 407 to 414 (7)	
	saveblockevent Lines: 414 to 449 (35)	
	tracealloc Lines: 818 to 843 (25)	
	traceallocfunc1 Lines: 831 to 851 (20)	
	tracefree Lines: 843 to 859 (16)	
	tracefreefunc1 Lines: 851 to 853 (2)	
	tracegc Lines: 859 to 870 (11)	
File: mranges.go	
	addrRangesubtract Lines: 41 to 72 (31)	
	(*addrRanges)init Lines: 72 to 87 (15)	
	(*addrRanges)findSucc Lines: 87 to 96 (9)	
	(*addrRanges)contains Lines: 96 to 107 (11)	
	(*addrRanges)add Lines: 107 to 429 (322)	
File: mstats.go	
	init3 Lines: 429 to 591 (162)	
	cachestats Lines: 591 to 606 (15)	
	flushmcache Lines: 606 to 631 (25)	
	purgecachedstats Lines: 631 to 658 (27)	
	mSysStatInc Lines: 658 to 675 (17)	
	mSysStatDec Lines: 675 to 677 (2)	
File: mwbbuf.go	
	(*wbBuf)reset Lines: 86 to 174 (88)	
	wbBufFlush Lines: 174 to 243 (69)	
	wbBufFlushfunc1 Lines: 206 to 218 (12)	
	wbBufFlush1 Lines: 243 to 247 (4)	
File: nbpipe_pipe2.go	
	nonblockingPipe Lines: 9 to 104 (95)	
File: netpoll.go	
	netpollGenericInit Lines: 108 to 132 (24)	
	(*pollCache)free Lines: 172 to 181 (9)	
	netpollready Lines: 344 to 376 (32)	
	netpollblockcommit Lines: 376 to 394 (18)	
	netpollblock Lines: 394 to 429 (35)	
	netpollunblock Lines: 429 to 510 (81)	
	(*pollCache)alloc Lines: 510 to 512 (2)	
File: netpoll_epoll.go	
	netpollinit Lines: 27 to 59 (32)	
	netpollopen Lines: 59 to 76 (17)	
	netpollBreak Lines: 76 to 99 (23)	
	netpoll Lines: 99 to 123 (24)	
File: os_linux.go	
	futexsleep Lines: 37 to 55 (18)	
	futexwakeup Lines: 55 to 71 (16)	
	futexwakeupfunc1 Lines: 64 to 468 (404)	
	getproccount Lines: 71 to 139 (68)	
	newosproc Lines: 139 to 196 (57)	
	sysargs Lines: 196 to 251 (55)	
	sysauxv Lines: 251 to 273 (22)	
	getHugePageSize Lines: 273 to 296 (23)	
	osinit Lines: 296 to 304 (8)	
	getRandomData Lines: 304 to 337 (33)	
	mpreinit Lines: 337 to 349 (12)	
	minit Lines: 349 to 400 (51)	
	setsig Lines: 400 to 423 (23)	
	setsigstack Lines: 423 to 453 (30)	
	sysSigaction Lines: 453 to 483 (30)	
	sysSigactionfunc1 Lines: 468 to 469 (1)	
	signalM Lines: 483 to 485 (2)	
File: os_linux_x86.go	
	osArchInit Lines: 15 to 64 (49)	
	mlockGsignal Lines: 64 to 72 (8)	
File: panic.go	
	panicCheck1 Lines: 31 to 49 (18)	
	panicCheck2 Lines: 49 to 86 (37)	
	goPanicIndex Lines: 86 to 90 (4)	
	goPanicIndexU Lines: 90 to 96 (6)	
	goPanicSliceAlen Lines: 96 to 100 (4)	
	goPanicSliceAlenU Lines: 100 to 104 (4)	
	goPanicSliceAcap Lines: 104 to 108 (4)	
	goPanicSliceAcapU Lines: 108 to 114 (6)	
	goPanicSliceB Lines: 114 to 118 (4)	
	goPanicSliceBU Lines: 118 to 124 (6)	
	goPanicSlice3Alen Lines: 124 to 128 (4)	
	goPanicSlice3AlenU Lines: 128 to 152 (24)	
	goPanicSlice3C Lines: 152 to 182 (30)	
	panicshift Lines: 182 to 189 (7)	
	panicdivide Lines: 189 to 218 (29)	
	deferproc Lines: 218 to 268 (50)	
	deferprocStack Lines: 268 to 334 (66)	
	testdefersizes Lines: 334 to 370 (36)	
	init4 Lines: 370 to 383 (13)	
	newdefer Lines: 383 to 439 (56)	
	newdeferfunc1 Lines: 392 to 411 (19)	
	newdeferfunc2 Lines: 411 to 459 (48)	
	freedefer Lines: 439 to 500 (61)	
	freedeferfunc1 Lines: 459 to 661 (202)	
	freedeferpanic Lines: 500 to 505 (5)	
	freedeferfn Lines: 505 to 526 (21)	
	deferreturn Lines: 526 to 660 (134)	
	preprintpanics Lines: 660 to 679 (19)	
	preprintpanicsfunc1 Lines: 661 to 720 (59)	
	printpanics Lines: 679 to 711 (32)	
	addOneOpenDeferFrame Lines: 711 to 791 (80)	
	addOneOpenDeferFramefunc1 Lines: 718 to 1105 (387)	
	addOneOpenDeferFrame.func11 Lines: 720 to 743 (23)	
	readvarintUnsafe Lines: 791 to 812 (21)	
	runOpenDeferFrame Lines: 812 to 873 (61)	
	reflectcallSave Lines: 873 to 887 (14)	
	gopanic Lines: 887 to 1070 (183)	
	getargp Lines: 1070 to 1087 (17)	
	gorecover Lines: 1087 to 1097 (10)	
	throw Lines: 1102 to 1132 (30)	
	throwfunc1 Lines: 1105 to 1164 (59)	
	recovery Lines: 1132 to 1158 (26)	
	fatalthrow Lines: 1158 to 1185 (27)	
	fatalthrowfunc1 Lines: 1164 to 1192 (28)	
	fatalpanic Lines: 1185 to 1234 (49)	
	fatalpanicfunc1 Lines: 1192 to 1215 (23)	
	fatalpanicfunc2 Lines: 1215 to 1217 (2)	
	startpanic_m Lines: 1234 to 1285 (51)	
	dopanic_m Lines: 1285 to 1366 (81)	
	shouldPushSigpanic Lines: 1366 to 1373 (7)	
File: preempt.go	
	suspendG Lines: 105 to 258 (153)	
	resumeG Lines: 258 to 302 (44)	
	asyncPreempt2 Lines: 302 to 317 (15)	
	init5 Lines: 317 to 359 (42)	
	isAsyncSafePoint Lines: 359 to 419 (60)	
File: preempt_amd64.s	
	asyncPreempt Lines: 10 to 82 (72)	
File: print.go	
	recordForPanic Lines: 40 to 66 (26)	
	printlock Lines: 66 to 76 (10)	
	printunlock Lines: 76 to 86 (10)	
	gwrite Lines: 86 to 106 (20)	
	printsp Lines: 106 to 110 (4)	
	printnl Lines: 110 to 114 (4)	
	printbool Lines: 114 to 122 (8)	
	printfloat Lines: 122 to 194 (72)	
	printcomplex Lines: 194 to 198 (4)	
	printuint Lines: 198 to 211 (13)	
	printint Lines: 211 to 219 (8)	
	printhex Lines: 219 to 237 (18)	
	printpointer Lines: 237 to 241 (4)	
	printstring Lines: 241 to 245 (4)	
	printslice Lines: 245 to 251 (6)	
	printeface Lines: 251 to 264 (13)	
	hexdumpWords Lines: 264 to 309 (45)	
	hexdumpWordsfunc1 Lines: 265 to 276 (11)	
File: proc.go	
	main Lines: 113 to 241 (128)	
	mainfunc1 Lines: 133 to 157 (24)	
	mainfunc2 Lines: 157 to 314 (157)	
	init6 Lines: 241 to 245 (4)	
	forcegchelper Lines: 245 to 287 (42)	
	gopark Lines: 287 to 313 (26)	
	goready Lines: 313 to 320 (7)	
	goreadyfunc1 Lines: 314 to 774 (460)	
	acquireSudog Lines: 320 to 358 (38)	
	releaseSudog Lines: 358 to 416 (58)	
	funcPC Lines: 416 to 420 (4)	
	badmcall Lines: 420 to 424 (4)	
	badmcall2 Lines: 424 to 428 (4)	
	badreflectcall Lines: 428 to 436 (8)	
	badmorestackg0 Lines: 436 to 445 (9)	
	badmorestackgsignal Lines: 445 to 451 (6)	
	badctxt Lines: 451 to 465 (14)	
	allgadd Lines: 465 to 484 (19)	
	cpuinit Lines: 484 to 532 (48)	
	schedinit Lines: 532 to 600 (68)	
	checkmcount Lines: 600 to 608 (8)	
	mcommoninit Lines: 608 to 658 (50)	
	ready Lines: 658 to 693 (35)	
	freezetheworld Lines: 693 to 725 (32)	
	casfrom_Gscanstatus Lines: 725 to 752 (27)	
	castogscanstatus Lines: 752 to 772 (20)	
	casgstatus Lines: 772 to 826 (54)	
	casgstatusfunc1 Lines: 774 to 866 (92)	
	casGToPreemptScan Lines: 826 to 837 (11)	
	casGFromPreempted Lines: 837 to 858 (21)	
	stopTheWorld Lines: 858 to 865 (7)	
	startTheWorld Lines: 865 to 899 (34)	
	startTheWorldfunc1 Lines: 866 to 2933 (2067)	
	stopTheWorldWithSema Lines: 899 to 975 (76)	
	startTheWorldWithSema Lines: 975 to 1041 (66)	
	mstart Lines: 1041 to 1075 (34)	
	mstart1 Lines: 1075 to 1113 (38)	
	mstartm0 Lines: 1113 to 1134 (21)	
	mexit Lines: 1134 to 1233 (99)	
	forEachP Lines: 1233 to 1325 (92)	
	runSafePointFn Lines: 1325 to 1361 (36)	
	allocm Lines: 1361 to 1443 (82)	
	needm Lines: 1443 to 1506 (63)	
	newextram Lines: 1506 to 1523 (17)	
	oneNewExtraM Lines: 1523 to 1592 (69)	
	dropm Lines: 1592 to 1638 (46)	
	lockextra Lines: 1638 to 1703 (65)	
	newm Lines: 1703 to 1735 (32)	
	newm1 Lines: 1735 to 1783 (48)	
	templateThread Lines: 1783 to 1812 (29)	
	stopm Lines: 1812 to 1836 (24)	
	mspinning Lines: 1836 to 1845 (9)	
	startm Lines: 1845 to 1890 (45)	
	handoffp Lines: 1890 to 1958 (68)	
	stoplockedm Lines: 1958 to 1986 (28)	
	startlockedm Lines: 1986 to 2006 (20)	
	gcstopm Lines: 2006 to 2040 (34)	
	execute Lines: 2040 to 2075 (35)	
	findrunnable Lines: 2075 to 2368 (293)	
	pollWork Lines: 2368 to 2388 (20)	
	wakeNetPoller Lines: 2388 to 2401 (13)	
	resetspinning Lines: 2401 to 2421 (20)	
	injectglist Lines: 2421 to 2446 (25)	
	schedule Lines: 2446 to 2587 (141)	
	checkTimers Lines: 2587 to 2662 (75)	
	parkunlock_c Lines: 2662 to 2668 (6)	
	park_m Lines: 2668 to 2693 (25)	
	goschedImpl Lines: 2693 to 2709 (16)	
	gosched_m Lines: 2709 to 2729 (20)	
	gopreempt_m Lines: 2729 to 2739 (10)	
	preemptPark Lines: 2739 to 2769 (30)	
	goyield_m Lines: 2769 to 2781 (12)	
	goexit1 Lines: 2781 to 2792 (11)	
	goexit0 Lines: 2792 to 2861 (69)	
	save Lines: 2861 to 2913 (52)	
	reentersyscall Lines: 2913 to 2980 (67)	
	reentersyscallfunc1 Lines: 2933 to 3033 (100)	
	entersyscall Lines: 2980 to 2984 (4)	
	entersyscall_sysmon Lines: 2984 to 2993 (9)	
	entersyscall_gcwait Lines: 2993 to 3013 (20)	
	entersyscallblock Lines: 3013 to 3054 (41)	
	entersyscallblockfunc1 Lines: 3033 to 3040 (7)	
	entersyscallblockfunc2 Lines: 3040 to 3174 (134)	
	entersyscallblock_handoff Lines: 3054 to 3074 (20)	
	exitsyscall Lines: 3074 to 3155 (81)	
	exitsyscallfast Lines: 3155 to 3199 (44)	
	exitsyscallfastfunc1 Lines: 3174 to 3206 (32)	
	exitsyscallfast_reacquired Lines: 3199 to 3217 (18)	
	exitsyscallfast_reacquiredfunc1 Lines: 3206 to 3357 (151)	
	exitsyscallfast_pidle Lines: 3217 to 3236 (19)	
	exitsyscall0 Lines: 3236 to 3353 (117)	
	malg Lines: 3353 to 3376 (23)	
	malgfunc1 Lines: 3357 to 3380 (23)	
	newproc Lines: 3376 to 3388 (12)	
	newprocfunc1 Lines: 3380 to 3591 (211)	
	newproc1 Lines: 3388 to 3495 (107)	
	saveAncestors Lines: 3495 to 3528 (33)	
	gfput Lines: 3528 to 3563 (35)	
	gfget Lines: 3563 to 3607 (44)	
	gfgetfunc1 Lines: 3591 to 4115 (524)	
	gfpurge Lines: 3607 to 3718 (111)	
	unlockOSThread Lines: 3718 to 3727 (9)	
	badunlockosthread Lines: 3727 to 3754 (27)	
	_System Lines: 3754 to 3755 (1)	
	_ExternalCode Lines: 3755 to 3756 (1)	
	_LostExternalCode Lines: 3756 to 3757 (1)	
	_GC Lines: 3757 to 3758 (1)	
	_LostSIGPROFDuringAtomic64 Lines: 3758 to 3759 (1)	
	_VDSO Lines: 3759 to 3764 (5)	
	sigprof Lines: 3764 to 3935 (171)	
	sigprofNonGo Lines: 3935 to 3952 (17)	
	sigprofNonGoPC Lines: 3952 to 3972 (20)	
	setsSP Lines: 3972 to 4026 (54)	
	(*p)init Lines: 4026 to 4058 (32)	
	(*p)destroy Lines: 4058 to 4154 (96)	
	(*p).destroyfunc1 Lines: 4115 to 4118 (3)	
	procresize Lines: 4154 to 4270 (116)	
	acquirep Lines: 4270 to 4291 (21)	
	wirep Lines: 4291 to 4312 (21)	
	releasep Lines: 4312 to 4333 (21)	
	incidlelocked Lines: 4333 to 4345 (12)	
	checkdead Lines: 4345 to 4455 (110)	
	sysmon Lines: 4455 to 4569 (114)	
	retake Lines: 4569 to 4643 (74)	
	preemptall Lines: 4643 to 4666 (23)	
	preemptone Lines: 4666 to 4695 (29)	
	schedtrace Lines: 4695 to 4781 (86)	
	schedEnableUser Lines: 4781 to 4803 (22)	
	schedEnabled Lines: 4803 to 4863 (60)	
	globrunqget Lines: 4863 to 4894 (31)	
	pidleput Lines: 4894 to 4923 (29)	
	runqempty Lines: 4923 to 4949 (26)	
	runqput Lines: 4949 to 4984 (35)	
	runqputslow Lines: 4984 to 5027 (43)	
	runqget Lines: 5027 to 5056 (29)	
	runqgrab Lines: 5056 to 5111 (55)	
	runqsteal Lines: 5111 to 5270 (159)	
	(*randomOrder)reset Lines: 5349 to 5381 (32)	
	gcd Lines: 5381 to 5398 (17)	
	doInit Lines: 5398 to 5403 (5)	
File: profbuf.go	
	(*profBuf)takeOverflow Lines: 160 to 182 (22)	
	(*profBuf)incrementOverflow Lines: 182 to 238 (56)	
	(*profBuf)canWriteRecord Lines: 238 to 264 (26)	
	(*profBuf)canWriteTwoRecords Lines: 264 to 304 (40)	
	(*profBuf)write Lines: 304 to 408 (104)	
	(*profBuf)wakeupExtra Lines: 408 to 416 (8)	
File: runtime1.go	
	args Lines: 60 to 66 (6)	
	goargs Lines: 66 to 76 (10)	
	goenvs_unix Lines: 76 to 99 (23)	
	testAtomic64 Lines: 99 to 136 (37)	
	check Lines: 136 to 343 (207)	
	parsedebugvars Lines: 343 to 385 (42)	
	timediv Lines: 423 to 468 (45)	
File: runtime2.go	
	efaceOf Lines: 211 to 830 (619)	
	extendRandom Lines: 830 to 999 (169)	
	waitReasonString Lines: 999 to 1002 (3)	
File: rwmutex.go	
	(*rwmutex)rlock Lines: 33 to 62 (29)	
	(*rwmutex).rlockfunc1 Lines: 41 to 511 (470)	
	(*rwmutex)runlock Lines: 62 to 65 (3)	
File: sema.go	
	readyWithTime Lines: 79 to 98 (19)	
	semacquire1 Lines: 98 to 159 (61)	
	semrelease1 Lines: 159 to 222 (63)	
	cansemacquire Lines: 222 to 234 (12)	
	(*semaRoot)queue Lines: 234 to 321 (87)	
	(*semaRoot)dequeue Lines: 321 to 392 (71)	
	(*semaRoot)rotateLeft Lines: 392 to 420 (28)	
	(*semaRoot)rotateRight Lines: 420 to 607 (187)	
File: signal_amd64.go	
	dumpregs Lines: 15 to 48 (33)	
	(*sigctxt)preparePanic Lines: 48 to 69 (21)	
File: signal_linux_amd64.go	
	(*sigctxt)pushCall Lines: 30 to 86 (56)	
File: signal_unix.go	
	initsig Lines: 111 to 304 (193)	
	setThreadCPUProfiler Lines: 304 to 318 (14)	
	sigpipe Lines: 318 to 326 (8)	
	doSigPreempt Lines: 326 to 389 (63)	
	sigFetchG Lines: 389 to 403 (14)	
	sigtrampgo Lines: 403 to 457 (54)	
	adjustSignalStack Lines: 457 to 517 (60)	
	sighandler Lines: 517 to 668 (151)	
	sigpanic Lines: 668 to 717 (49)	
	dieFromSignal Lines: 717 to 747 (30)	
	raisebadsignal Lines: 747 to 802 (55)	
	crash Lines: 802 to 861 (59)	
	noSignalStack Lines: 861 to 869 (8)	
	sigNotOnStack Lines: 869 to 879 (10)	
	signalDuringFork Lines: 879 to 890 (11)	
	badsignal Lines: 890 to 918 (28)	
	sigfwdgo Lines: 918 to 1020 (102)	
	unblocksig Lines: 1020 to 1028 (8)	
	minitSignals Lines: 1028 to 1043 (15)	
	minitSignalStack Lines: 1043 to 1064 (21)	
	minitSignalMask Lines: 1064 to 1077 (13)	
	unminitSignals Lines: 1077 to 1156 (79)	
	signalstack Lines: 1156 to 1160 (4)	
File: sigqueue.go	
	sigsend Lines: 67 to 76 (9)	
File: slice.go	
	makeslice Lines: 34 to 76 (42)	
	growslice Lines: 76 to 158 (82)	
File: stack.go	
	stackinit Lines: 158 to 173 (15)	
	stacklog2 Lines: 173 to 182 (9)	
	stackpoolalloc Lines: 182 to 220 (38)	
	stackpoolfree Lines: 220 to 259 (39)	
	stackcacherefill Lines: 259 to 281 (22)	
	stackcacherelease Lines: 281 to 300 (19)	
	stackcache_clear Lines: 300 to 324 (24)	
	stackalloc Lines: 324 to 422 (98)	
	stackfree Lines: 422 to 570 (148)	
	adjustpointers Lines: 570 to 619 (49)	
	adjustframe Lines: 619 to 714 (95)	
	adjustctxt Lines: 714 to 729 (15)	
	adjustdefers Lines: 729 to 758 (29)	
	adjustsudogs Lines: 758 to 771 (13)	
	findsghi Lines: 771 to 783 (12)	
	syncadjustsudogs Lines: 783 to 825 (42)	
	copystack Lines: 825 to 900 (75)	
	round2 Lines: 900 to 918 (18)	
	newstack Lines: 918 to 1087 (169)	
	shrinkstack Lines: 1087 to 1145 (58)	
	freeStackSpans Lines: 1145 to 1180 (35)	
	getStackMap Lines: 1180 to 1315 (135)	
	morestackc Lines: 1315 to 1316 (1)	
File: string.go	
	concatstrings Lines: 23 to 57 (34)	
	concatstring2 Lines: 57 to 61 (4)	
	concatstring3 Lines: 61 to 65 (4)	
	concatstring4 Lines: 65 to 69 (4)	
	concatstring5 Lines: 69 to 75 (6)	
	slicebytetostring Lines: 75 to 118 (43)	
	rawstringtmp Lines: 118 to 155 (37)	
	stringtoslicebyte Lines: 155 to 167 (12)	
	stringtoslicerune Lines: 167 to 191 (24)	
	slicerunetostring Lines: 191 to 233 (42)	
	intstring Lines: 233 to 258 (25)	
	rawstring Lines: 258 to 270 (12)	
	rawbyteslice Lines: 270 to 282 (12)	
	rawruneslice Lines: 282 to 315 (33)	
	gostring Lines: 315 to 334 (19)	
	index Lines: 334 to 363 (29)	
	atoi Lines: 363 to 417 (54)	
	findnull Lines: 417 to 502 (85)	
	parseRelease Lines: 502 to 530 (28)	
	parseReleasefunc1 Lines: 511 to 803 (292)	
File: stubs.go	
	badsystemstack Lines: 60 to 101 (41)	
	fastrand Lines: 110 to 120 (10)	
File: symtab.go	
	(*Frames)Next Lines: 73 to 154 (81)	
	expandCgoFrames Lines: 154 to 371 (217)	
	modulesinit Lines: 371 to 433 (62)	
	moduledataverify Lines: 433 to 441 (8)	
	moduledataverify1 Lines: 441 to 493 (52)	
	FuncForPC Lines: 493 to 520 (27)	
	(*Func)Name Lines: 520 to 559 (39)	
	findmoduledatap Lines: 559 to 580 (21)	
	findfunc Lines: 580 to 648 (68)	
	pcvalue Lines: 648 to 745 (97)	
	funcname Lines: 745 to 756 (11)	
	funcnameFromNameoff Lines: 756 to 768 (12)	
	funcline1 Lines: 768 to 783 (15)	
	funcline Lines: 783 to 787 (4)	
	funcspdelta Lines: 787 to 796 (9)	
	funcMaxSPDelta Lines: 796 to 818 (22)	
	pcdatavalue Lines: 818 to 825 (7)	
	pcdatavalue1 Lines: 825 to 832 (7)	
	funcdata Lines: 832 to 847 (15)	
	step Lines: 847 to 872 (25)	
	readvarint Lines: 872 to 875 (3)	
File: sys_linux_amd64.s	
	exit Lines: 55 to 62 (7)	
	exitThread Lines: 62 to 74 (12)	
	open Lines: 74 to 87 (13)	
	closefd Lines: 87 to 97 (10)	
	write1 Lines: 97 to 106 (9)	
	read Lines: 106 to 116 (10)	
	pipe Lines: 116 to 124 (8)	
	pipe2 Lines: 124 to 131 (7)	
	usleep Lines: 131 to 149 (18)	
	gettid Lines: 149 to 155 (6)	
	raise Lines: 155 to 168 (13)	
	raiseproc Lines: 168 to 177 (9)	
	getpid Lines: 177 to 183 (6)	
	tgkill Lines: 183 to 191 (8)	
	setitimer Lines: 191 to 199 (8)	
	mincore Lines: 199 to 209 (10)	
	walltime1 Lines: 209 to 268 (59)	
	nanotime1 Lines: 268 to 327 (59)	
	rtsigprocmask Lines: 327 to 339 (12)	
	rt_sigaction Lines: 339 to 349 (10)	
	callCgoSigaction Lines: 349 to 362 (13)	
	sigfwd Lines: 362 to 374 (12)	
	sigtramp Lines: 374 to 403 (29)	
	cgoSigtramp Lines: 403 to 481 (78)	
	sigreturn Lines: 481 to 486 (5)	
	sysMmap Lines: 486 to 509 (23)	
	callCgoMmap Lines: 509 to 526 (17)	
	sysMunmap Lines: 526 to 537 (11)	
	callCgoMunmap Lines: 537 to 549 (12)	
	madvise Lines: 549 to 560 (11)	
	futex Lines: 560 to 573 (13)	
	clone Lines: 573 to 628 (55)	
	sigaltstack Lines: 628 to 638 (10)	
	settls Lines: 638 to 655 (17)	
	osyield Lines: 655 to 660 (5)	
	sched_getaffinity Lines: 660 to 670 (10)	
	epollcreate Lines: 670 to 678 (8)	
	epollcreate1 Lines: 678 to 686 (8)	
	epollctl Lines: 686 to 698 (12)	
	epollwait Lines: 698 to 710 (12)	
	closeonexec Lines: 710 to 719 (9)	
	setNonblock Lines: 719 to 775 (56)	
	uname Lines: 775 to 783 (8)	
	mlock Lines: 783 to 788 (5)	
File: time.go	
	addtimer Lines: 247 to 262 (15)	
	addInitializedTimer Lines: 262 to 279 (17)	
	doaddtimer Lines: 279 to 304 (25)	
	deltimer Lines: 304 to 349 (45)	
	dodeltimer Lines: 349 to 383 (34)	
	dodeltimer0 Lines: 383 to 494 (111)	
	resettimer Lines: 494 to 547 (53)	
	cleantimers Lines: 547 to 598 (51)	
	moveTimers Lines: 598 to 651 (53)	
	adjusttimers Lines: 651 to 725 (74)	
	addAdjustedTimers Lines: 725 to 758 (33)	
	runtimer Lines: 758 to 833 (75)	
	runOneTimer Lines: 833 to 897 (64)	
	clearDeletedTimers Lines: 897 to 1010 (113)	
	timeSleepUntil Lines: 1010 to 1079 (69)	
	siftupTimer Lines: 1079 to 1099 (20)	
	siftdownTimer Lines: 1099 to 1104 (5)	
File: time_nofake.go	
	nanotime Lines: 18 to 19 (1)	
File: trace.go	
	traceReader Lines: 443 to 459 (16)	
	traceProcFree Lines: 459 to 500 (41)	
	traceEvent Lines: 500 to 527 (27)	
	traceEventLocked Lines: 527 to 575 (48)	
	traceStackID Lines: 575 to 596 (21)	
	traceAcquireBuffer Lines: 596 to 606 (10)	
	traceReleaseBuffer Lines: 606 to 614 (8)	
	traceFlush Lines: 614 to 718 (104)	
	(*traceBuf)varint Lines: 718 to 764 (46)	
	(*traceStackTable)put Lines: 764 to 797 (33)	
	(*traceStackTable)find Lines: 797 to 814 (17)	
	(*traceStackTable)newStack Lines: 814 to 924 (110)	
	(*traceAlloc)alloc Lines: 924 to 958 (34)	
	traceProcStart Lines: 958 to 962 (4)	
	traceProcStop Lines: 962 to 995 (33)	
	traceGCSweepStart Lines: 995 to 1009 (14)	
	traceGCSweepSpan Lines: 1009 to 1019 (10)	
	traceGCSweepDone Lines: 1019 to 1038 (19)	
	traceGoCreate Lines: 1038 to 1046 (8)	
	traceGoStart Lines: 1046 to 1076 (30)	
	traceGoPark Lines: 1076 to 1083 (7)	
	traceGoUnpark Lines: 1083 to 1094 (11)	
	traceGoSysCall Lines: 1094 to 1098 (4)	
	traceGoSysExit Lines: 1098 to 1117 (19)	
	traceGoSysBlock Lines: 1117 to 1128 (11)	
	traceHeapAlloc Lines: 1128 to 1132 (4)	
	traceNextGC Lines: 1132 to 1137 (5)	
File: traceback.go	
	tracebackdefers Lines: 50 to 98 (48)	
	gentraceback Lines: 98 to 590 (492)	
	getArgInfo Lines: 590 to 636 (46)	
	tracebackCgoContext Lines: 636 to 666 (30)	
	printcreatedby Lines: 666 to 675 (9)	
	printcreatedby1 Lines: 675 to 689 (14)	
	traceback Lines: 689 to 701 (12)	
	tracebacktrap Lines: 701 to 710 (9)	
	traceback1 Lines: 710 to 755 (45)	
	printAncestorTraceback Lines: 755 to 777 (22)	
	printAncestorTracebackFuncInfo Lines: 777 to 798 (21)	
	callers Lines: 798 to 809 (11)	
	callersfunc1 Lines: 803 to 984 (181)	
	gcallers Lines: 809 to 815 (6)	
	showframe Lines: 815 to 825 (10)	
	showfuncinfo Lines: 825 to 880 (55)	
	goroutineheader Lines: 880 to 917 (37)	
	tracebackothers Lines: 917 to 953 (36)	
	tracebackHexdump Lines: 953 to 1021 (68)	
	tracebackHexdumpfunc1 Lines: 984 to 987 (3)	
	isSystemGoroutine Lines: 1021 to 1255 (234)	
	printCgoTraceback Lines: 1255 to 1280 (25)	
	printOneCgoTraceback Lines: 1280 to 1307 (27)	
	callCgoSymbolizer Lines: 1307 to 1321 (14)	
	cgoContextPCs Lines: 1321 to 1333 (12)	
File: type.go	
	(*_type)string Lines: 50 to 59 (9)	
	(*_type)uncommon Lines: 59 to 136 (77)	
	(*_type)pkgpath Lines: 136 to 185 (49)	
	resolveNameOff Lines: 185 to 219 (34)	
	resolveTypeOff Lines: 219 to 259 (40)	
	(*_type)textOff Lines: 259 to 460 (201)	
	nametagLen Lines: 460 to 467 (7)	
	namename Lines: 467 to 481 (14)	
	nametag Lines: 481 to 493 (12)	
	namepkgPath Lines: 493 to 508 (15)	
	nameisBlank Lines: 508 to 519 (11)	
	typelinksinit Lines: 519 to 588 (69)	
	typesEqual Lines: 588 to 723 (135)	
File: utf8.go	
	decoderune Lines: 60 to 104 (44)	
	encoderune Lines: 104 to 108 (4)	
File: vdso_linux.go	
	vdsoInitFromSysinfoEhdr Lines: 103 to 185 (82)	
	vdsoFindVersion Lines: 185 to 208 (23)	
	vdsoParseSymbols Lines: 208 to 267 (59)	
	vdsoParseSymbolsfunc1 Lines: 213 to 226 (13)	
	vdsoauxv Lines: 267 to 286 (19)	
	inVDSOPage Lines: 286 to 289 (3)	
Package runtime/debug: runtime
File: mgc.go	
	setGCPercent Lines: 222 to 412 (190)	
File: runtime1.go	
	SetTraceback Lines: 385 to 423 (38)	
Package runtime/internal/atomic: runtime/internal/atomic
File: asm_amd64.s	
	Cas64 Lines: 35 to 44 (9)	
	Casuintptr Lines: 44 to 56 (12)	
	Storeuintptr Lines: 56 to 131 (75)	
	Store Lines: 131 to 146 (15)	
	Store64 Lines: 146 to 149 (3)	
Package sort: sort
File: <autogenerated>	
	(*StringSlice)Len Lines: 1 to 1 (0)	
	(*StringSlice)Less Lines: 1 to 298 (297)	
	(*StringSlice)Swap Lines: 1 to 26 (25)	
File: sort.go	
	insertionSort Lines: 25 to 35 (10)	
	siftDown Lines: 35 to 53 (18)	
	heapSort Lines: 53 to 74 (21)	
	medianOfThree Lines: 74 to 90 (16)	
	swapRange Lines: 90 to 96 (6)	
	doPivot Lines: 96 to 183 (87)	
	quickSort Lines: 183 to 216 (33)	
	Sort Lines: 216 to 225 (9)	
	maxDepth Lines: 225 to 297 (72)	
	StringSliceLen Lines: 297 to 298 (1)	
	StringSliceLess Lines: 298 to 299 (1)	
	StringSliceSwap Lines: 299 to 356 (57)	
	Stable Lines: 356 to 360 (4)	
	stable Lines: 360 to 403 (43)	
	symMerge Lines: 403 to 489 (86)	
	rotate Lines: 489 to 504 (15)	
Package strconv: strconv
File: atoi.go	
	init Lines: 18 to 21 (3)	
File: decimal.go	
	trim Lines: 71 to 81 (10)	
	(*decimal)Assign Lines: 81 to 110 (29)	
	rightShift Lines: 110 to 257 (147)	
	prefixIsLessThan Lines: 257 to 269 (12)	
	leftShift Lines: 269 to 315 (46)	
	(*decimal)Shift Lines: 315 to 354 (39)	
	(*decimal)Round Lines: 354 to 375 (21)	
	(*decimal)RoundUp Lines: 375 to 382 (7)	
File: extfloat.go	
	(*extFloat)AssignComputeBounds Lines: 181 to 306 (125)	
	(*extFloat)frexp10 Lines: 306 to 338 (32)	
	frexp10Many Lines: 338 to 348 (10)	
	(*extFloat)FixedDecimal Lines: 348 to 466 (118)	
	adjustLastDigitFixed Lines: 466 to 502 (36)	
	(*extFloat)ShortestDecimal Lines: 502 to 615 (113)	
	adjustLastDigit Lines: 615 to 621 (6)	
File: ftoa.go	
	genericFtoa Lines: 57 to 161 (104)	
	bigFtoa Lines: 161 to 197 (36)	
	formatDigits Lines: 197 to 234 (37)	
	roundShortest Lines: 234 to 378 (144)	
	fmtE Lines: 378 to 433 (55)	
	fmtF Lines: 433 to 466 (33)	
	fmtB Lines: 466 to 489 (23)	
	fmtX Lines: 489 to 502 (13)	
File: itoa.go	
	FormatInt Lines: 25 to 40 (15)	
	AppendInt Lines: 40 to 89 (49)	
	formatBits Lines: 89 to 91 (2)	
File: quote.go	
	appendQuotedWith Lines: 27 to 54 (27)	
	appendQuotedRuneWith Lines: 54 to 64 (10)	
	appendEscapedRune Lines: 64 to 205 (141)	
	CanBackquote Lines: 205 to 446 (241)	
	bsearch16 Lines: 446 to 461 (15)	
	bsearch32 Lines: 461 to 483 (22)	
	IsPrint Lines: 483 to 539 (56)	
	isInGraphicList Lines: 539 to 546 (7)	
Package strings: strings
File: builder.go	
	(*Builder)String Lines: 48 to 52 (4)	
	(*Builder)Len Lines: 52 to 88 (36)	
	(*Builder)Write Lines: 88 to 425 (337)	
File: strings.go	
	Join Lines: 425 to 428 (3)	
Package sync: runtime
File: map.go	
	init Lines: 70 to 70 (0)	
	(*Map)Load Lines: 102 to 136 (34)	
	(*Map)Store Lines: 136 to 169 (33)	
	(*entry)tryStore Lines: 169 to 199 (30)	
	(*Map)LoadOrStore Lines: 199 to 239 (40)	
	(*entry)tryLoadOrStore Lines: 239 to 339 (100)	
	(*Map)missLocked Lines: 339 to 349 (10)	
	(*Map)dirtyLocked Lines: 349 to 363 (14)	
	(*entry)tryExpungeLocked Lines: 363 to 371 (8)	
File: mgc.go	
	runtime_registerPoolCleanup Lines: 2207 to 2211 (4)	
File: mprof.go	
	event Lines: 449 to 818 (369)	
File: mutex.go	
	(*Mutex)lockSlow Lines: 84 to 179 (95)	
	(*Mutex)Unlock Lines: 179 to 194 (15)	
	(*Mutex)unlockSlow Lines: 194 to 196 (2)	
File: once.go	
	(*Once)doSlow Lines: 61 to 90 (29)	
File: panic.go	
	throw Lines: 1097 to 1102 (5)	
File: pool.go	
	(*Pool)Put Lines: 90 to 124 (34)	
	(*Pool)Get Lines: 124 to 153 (29)	
	(*Pool)getSlow Lines: 153 to 195 (42)	
	(*Pool)pin Lines: 195 to 209 (14)	
	(*Pool)pinSlow Lines: 209 to 233 (24)	
	poolCleanup Lines: 233 to 272 (39)	
	init0 Lines: 272 to 274 (2)	
File: poolqueue.go	
	(*poolDequeue)pushHead Lines: 80 to 112 (32)	
	(*poolDequeue)popHead Lines: 112 to 147 (35)	
	(*poolDequeue)popTail Lines: 147 to 228 (81)	
	(*poolChain)pushHead Lines: 228 to 258 (30)	
	(*poolChain)popHead Lines: 258 to 271 (13)	
	(*poolChain)popTail Lines: 271 to 274 (3)	
File: proc.go	
	runtime_procPin Lines: 5270 to 5279 (9)	
	runtime_procUnpin Lines: 5279 to 5292 (13)	
	runtime_canSpin Lines: 5310 to 5327 (17)	
	runtime_doSpin Lines: 5327 to 5349 (22)	
File: runtime.go	
	init1 Lines: 55 to 62 (7)	
File: rwmutex.go	
	(*RWMutex)RUnlock Lines: 62 to 77 (15)	
	(*RWMutex)rUnlockSlow Lines: 77 to 78 (1)	
File: sema.go	
	runtime_Semacquire Lines: 55 to 60 (5)	
	runtime_Semrelease Lines: 65 to 70 (5)	
	runtime_SemacquireMutex Lines: 70 to 75 (5)	
	runtime_notifyListCheck Lines: 607 to 615 (8)	
	runtime_nanotime Lines: 615 to 616 (1)	
File: waitgroup.go	
	(*WaitGroup)Add Lines: 53 to 103 (50)	
	(*WaitGroup)Wait Lines: 103 to 132 (29)	
Package sync/atomic: runtime
File: asm.s	
	CompareAndSwapUintptr Lines: 31 to 76 (45)	
	StoreUint32 Lines: 76 to 85 (9)	
	StoreUintptr Lines: 85 to 328 (243)	
File: atomic_pointer.go	
	StorePointer Lines: 47 to 72 (25)	
	CompareAndSwapPointer Lines: 72 to 74 (2)	
File: proc.go	
	runtime_procPin Lines: 5270 to 5279 (9)	
	runtime_procUnpin Lines: 5279 to 5310 (31)	
File: value.go	
	(*Value)Store Lines: 45 to 47 (2)	
Package syscall: runtime
File: <autogenerated>	
	(*Errno)Error Lines: 1 to 1 (0)	
File: asm_linux_amd64.s	
	Syscall Lines: 18 to 41 (23)	
	Syscall6 Lines: 41 to 63 (22)	
File: dirent.go	
	readIntLE Lines: 41 to 64 (23)	
	ParseDirent Lines: 64 to 86 (22)	
File: env_unix.go	
	init Lines: 26 to 979 (953)	
	copyenv Lines: 36 to 71 (35)	
	Getenv Lines: 71 to 105 (34)	
File: exec_unix.go	
	SetNonblock Lines: 105 to 110 (5)	
File: runtime.go	
	runtime_envs Lines: 53 to 59 (6)	
File: str.go	
	itoa Lines: 7 to 14 (7)	
	uitoa Lines: 14 to 47 (33)	
File: syscall.go	
	ByteSliceFromString Lines: 47 to 858 (811)	
File: syscall_linux.go	
	direntIno Lines: 858 to 862 (4)	
	direntReclen Lines: 862 to 863 (1)	
File: syscall_unix.go	
	ErrnoError Lines: 118 to 119 (1)	
File: zsyscall_linux_amd64.go	
	openat Lines: 62 to 78 (16)	
	readlinkat Lines: 78 to 120 (42)	
	unlinkat Lines: 120 to 284 (164)	
	Close Lines: 284 to 381 (97)	
	fcntl Lines: 381 to 422 (41)	
	Getdents Lines: 422 to 679 (257)	
	read Lines: 679 to 907 (228)	
	write Lines: 907 to 956 (49)	
	munmap Lines: 956 to 1221 (265)	
	Pwrite Lines: 1221 to 1258 (37)	
	Seek Lines: 1258 to 1474 (216)	
	fstatat Lines: 1474 to 1626 (152)	
	mmap Lines: 1626 to 1629 (3)	
Package time: runtime
File: <autogenerated>	
	(*Time)String Lines: 1 to 1 (0)	
	(*fileSizeError)Error Lines: 1 to 26 (25)	
File: format.go	
	nextStdChunk Lines: 151 to 366 (215)	
	appendInt Lines: 366 to 416 (50)	
	init Lines: 394 to 678 (284)	
	formatNano Lines: 416 to 450 (34)	
	TimeString Lines: 450 to 495 (45)	
	TimeFormat Lines: 495 to 511 (16)	
	TimeAppendFormat Lines: 511 to 555 (44)	
File: sleep.go	
	when Lines: 28 to 74 (46)	
	(*Timer)Stop Lines: 74 to 155 (81)	
	AfterFunc Lines: 155 to 167 (12)	
	goFunc Lines: 167 to 168 (1)	
File: sys_unix.go	
	open Lines: 19 to 31 (12)	
	closefd Lines: 31 to 35 (4)	
	preadn Lines: 35 to 304 (269)	
File: time.go	
	startTimer Lines: 213 to 223 (10)	
	stopTimer Lines: 223 to 247 (24)	
	MonthString Lines: 304 to 337 (33)	
	WeekdayString Lines: 337 to 455 (118)	
	Timeabs Lines: 455 to 475 (20)	
	Timelocabs Lines: 475 to 593 (118)	
	TimeClock Lines: 593 to 768 (175)	
	fmtInt Lines: 768 to 973 (205)	
	Timedate Lines: 973 to 978 (5)	
	absDate Lines: 978 to 1093 (115)	
	Now Lines: 1093 to 1100 (7)	
File: timestub.go	
	now Lines: 15 to 443 (428)	
File: zoneinfo.go	
	(*Location)get Lines: 80 to 92 (12)	
	(*Location)String Lines: 92 to 117 (25)	
	(*Location)lookup Lines: 117 to 188 (71)	
	(*Location)lookupFirstZone Lines: 188 to 217 (29)	
	(*Location)firstZoneUsed Lines: 217 to 219 (2)	
File: zoneinfo_read.go	
	fileSizeErrorError Lines: 25 to 53 (28)	
	(*dataIO)big4 Lines: 53 to 62 (9)	
	(*dataIO)big8 Lines: 62 to 82 (20)	
	byteString Lines: 82 to 97 (15)	
	LoadLocationFromTZData Lines: 97 to 313 (216)	
	loadTzinfoFromDirOrZip Lines: 313 to 349 (36)	
	loadTzinfoFromZip Lines: 349 to 466 (117)	
	loadTzinfo Lines: 466 to 477 (11)	
	loadLocation Lines: 477 to 499 (22)	
	readFile Lines: 499 to 513 (14)	
File: zoneinfo_unix.go	
	initLocal Lines: 28 to 394 (366)	
Package unicode: unicode
File: tables.go	
	init Lines: 9 to 95 (86)	
Package unicode/utf8: unicode/utf8
File: utf8.go	
	DecodeRune Lines: 151 to 199 (48)	
	DecodeRuneInString Lines: 199 to 247 (48)	
	DecodeLastRune Lines: 247 to 341 (94)	
	EncodeRune Lines: 341 to 373 (32)	
	RuneCount Lines: 373 to 410 (37)	
	RuneCountInString Lines: 410 to 413 (3)	

Strengthen literal obfuscation

Some ideas:

  • add some light obfuscation to the panic literals of garbleDecrypt
  • randomize function signature of garbleDecrypt e.g. include additional parameters such as ints
  • different locations of the key, as a global variable, inside garbleDecrypt, as a parameter
  • different encodings for the key, string, base64, XOR spread across multiple variables
  • multiple decrypt functions in a single package to make finding the/ all decrypt functions not as easy as analyzing which function is called with all literals
  • have a slice/map with all literals of the package, where the decrypt function then recieves a position number or a slice element to decrypt

Many of these will add more complexity (more to test, we maybe need additional flags to test specific combinations), some of it might not be worth the extra burden to maintain.

Note: "random" is always pseudo-random (deterministic), expect when -random is passed then it can be true random (crypto/rand).

don't leak what Go version built the garbled binary

Right now, we strip module build info, so go version -m binary doesn't say anything about a module's path or version. However, go version binary will still tell you exactly what Go version built the binary.

This is being leaked for no real reason. Let's get rid of it.

/cc @nick-jones

Moving all constants to variables can fail

When using garble build -literals with golang.org/x/sys included in the GOPRIVATE env varaible I noticed that just moving all constants to variables on string obfuscation can lead to an error.

# golang.org/x/sys/unix
typecheck error: ../../../go/pkg/mod/golang.org/x/[email protected]/unix/affinity_linux.go:17:14: array length cpuSetSize (variable of type int) must be constant

The problem arises when using a constant as the array length of variable or type alias.

const arrayLen = 4
var array [arrayLen]byte

type typeAlias [arrayLen]byte

Note: Builds without -literals are unaffected

Name obfuscation using buildid

I've noticed that when you run go tool buildid on the the binary produced by garble, the value returned includes the buildid that was using when compiling the main package. I'm unsure if buildids from other packages feature in the final binary (happy to go searching if wanted). The slight issue I note from this is that it offers a piece of information that makes it somewhat easier to brute force the original names from the main package. By way of example:

$ cat main.go
package main

import "fmt"

func main() {
        w := wrapper{}
        fmt.Println(w.String())
}

type wrapper struct {
        val string
}

func (w wrapper) String() string {
        if w.val == "" {
                panic("empty")
        }
        return w.val
}
$ garble build
$ ./tmp
panic: empty

goroutine 1 [running]:
main.zz52X_Y_6.String(...)
        z0.go:16
main.main()
        z0.go:7 +0x39

So we have zz52X_Y_6 as a obfuscated name.. now:

$ cat guess.go 
package main

import (
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"io"
	"os"
	"strings"
)

var (
	words = []string{"i", "j", "k", "err", "String", "Error", "error", "wrapper"}
	b64   = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_z")
)

func main() {
	buildID, name := os.Args[1], os.Args[2]
	ids := strings.Split(buildID, "/")
	salt := ids[1] // seems to be consistently this element
	for _, word := range words {
		h := hashWith(salt, word)
		if name[1:9] == h {
			fmt.Printf("hit! %s = %s\n", name, word)
		}
	}
}

func hashWith(salt, value string) string {
	const length = 8

	d := sha256.New()
	io.WriteString(d, salt)
	io.WriteString(d, value)
	sum := b64.EncodeToString(d.Sum(nil))

	return sum[:length]
}
$ go tool buildid tmp
9ZkA5Dw59qQzeQ8yU2Ub/PImGb-ruZkrufOw2flzK/w9Eeihvs9tlM-J2A1jux/d_DMQBAPNPqDNOc0UMbp
$ go run . 9ZkA5Dw59qQzeQ8yU2Ub/PImGb-ruZkrufOw2flzK/w9Eeihvs9tlM-J2A1jux/d_DMQBAPNPqDNOc0UMbp zz52X_Y_6
hit! zz52X_Y_6 = wrapper

Obviously this is a low skill method and this is by no means disastrous. But it wouldn't surprise me if you could pull off a relatively decent success rate by compiling a bunch of struct/var/etc names from repositories hosted on github and elsewhere. Programmer vocabulary is arguably fairly limited ;) And the fact the salt is not secret in this particular instance certainly makes it easier to pull off.

In any case, I was wondering if perhaps seed should be set by default? This is written in the hashWith function but by default it is empty.

garble fails while normal builds are fine

Please take a look at goptions_demo.go file at
https://gist.github.com/suntong/2bb1af9f859ad499ca4eec0b360bdf6d

It builds fine with normal go build, but fails with garble builds:

/tmp/goptions_demo$ go build -v -a -trimpath -toolexec=garble
internal/cpu
runtime/internal/atomic
runtime/internal/sys
internal/bytealg
runtime/internal/math
math/bits
math
runtime
unicode/utf8
internal/race
sync/atomic
unicode
internal/testlog
internal/nettrace
runtime/cgo
sync
internal/reflectlite
internal/singleflight
math/rand
errors
sort
strconv
io
internal/oserror
syscall
reflect
time
internal/poll
internal/fmtsort
internal/syscall/unix
context
os
vendor/golang.org/x/net/dns/dnsmessage
fmt
net
strings
net/url
path/filepath
bytes
regexp/syntax
regexp
text/tabwriter
io/ioutil
text/template/parse
text/template
github.com/voxelbrain/goptions
# github.com/voxelbrain/goptions
/tmp/garble-build688875629/z1.go:14:2: undefined: HelpFunc
exit status 2

Same for the picv.go file at
https://gist.github.com/suntong/7eed1480ce3e7f508b4d728547696a33

it fails with garble builds:

/tmp/picv$ go build -v -a -trimpath -toolexec=garble
runtime/internal/atomic
internal/cpu
runtime/internal/sys
internal/bytealg
runtime/internal/math
math/bits
math
runtime
unicode/utf8
internal/race
sync/atomic
unicode
internal/testlog
crypto/internal/subtle
crypto/subtle
encoding
unicode/utf16
internal/nettrace
runtime/cgo
container/list
vendor/golang.org/x/crypto/cryptobyte/asn1
vendor/golang.org/x/crypto/internal/subtle
vendor/golang.org/x/crypto/curve25519
sync
internal/reflectlite
math/rand
internal/singleflight
errors
sort
strconv
io
internal/oserror
syscall
reflect
time
internal/fmtsort
internal/syscall/unix
bytes
internal/poll
bufio
os
encoding/binary
crypto/cipher
fmt
crypto/aes
strings
encoding/base64
context
math/big
encoding/json
vendor/golang.org/x/net/dns/dnsmessage
crypto/rand
net
path/filepath
go/token
go/scanner
go/ast
io/ioutil
go/parser
regexp/syntax
regexp
github.com/mkideal/pkg/expr
golang.org/x/sys/unix
compress/flate
hash
hash/crc32
compress/gzip
crypto
crypto/des
crypto/elliptic
crypto/internal/randutil
crypto/sha512
encoding/asn1
crypto/ecdsa
crypto/ed25519/internal/edwards25519
crypto/ed25519
github.com/Bowery/prompt
github.com/mattn/go-isatty
github.com/mattn/go-colorable
github.com/labstack/gommon/color
crypto/hmac
crypto/md5
crypto/rc4
crypto/rsa
crypto/sha1
crypto/sha256
crypto/dsa
encoding/hex
crypto/x509/pkix
encoding/pem
github.com/mkideal/pkg/debug
vendor/golang.org/x/crypto/cryptobyte
net/url
crypto/x509
vendor/golang.org/x/crypto/internal/chacha20
vendor/golang.org/x/crypto/poly1305
vendor/golang.org/x/sys/cpu
vendor/golang.org/x/crypto/chacha20poly1305
vendor/golang.org/x/crypto/hkdf
vendor/golang.org/x/text/transform
crypto/tls
log
vendor/golang.org/x/text/unicode/bidi
vendor/golang.org/x/text/secure/bidirule
vendor/golang.org/x/text/unicode/norm
vendor/golang.org/x/net/idna
net/textproto
vendor/golang.org/x/net/http/httpproxy
vendor/golang.org/x/net/http2/hpack
vendor/golang.org/x/net/http/httpguts
mime
mime/quotedprintable
net/http/httptrace
net/http/internal
mime/multipart
path
os/exec
net/http
github.com/mkideal/cli
_/tmp/picv
# _/tmp/picv
golang.org/x/sys/unix.zSkhqhDfe: relocation target golang.org/x/sys/unix.ZqRpXh65u not defined
golang.org/x/sys/unix.zpceG5M_Z: relocation target golang.org/x/sys/unix.ZqRpXh65u not defined
golang.org/x/sys/unix.zPcjx04eR: relocation target golang.org/x/sys/unix.ZqM6zWxjn not defined
github.com/Bowery/prompt.zYL206_Vx: relocation target golang.org/x/sys/unix.ZqRpXh65u not defined
github.com/Bowery/prompt.zo2zFITGp: relocation target golang.org/x/sys/unix.ZqRpXh65u not defined
github.com/Bowery/prompt.zOfvBNBqY: relocation target golang.org/x/sys/unix.ZqRpXh65u not defined
exit status 2

$ go version
go version go1.13.8 linux/amd64

$ lsb_release -a 
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04 LTS
Release:        18.04
Codename:       bionic

don't garble literals which are used in constant expressions

For example:

package p

func str() string { return "foo" }

const length = len("foo")

type T [length]byte

Replacing len("foo") with len(str()) breaks the code:

./main.go:5:7: const initializer len(str()) is not a constant

One possible way to implement this would be to do a first pass on the syntax tree, find all expressions that need to be constant (such as those used in type definitions, or used in const declarations which we are not turning to var), and mark them so that we don't garble them.

/cc @lu4p

Garble with buildmode=plugin error

Yes, the garble build is working without any error or warn, but the output so file looks not correct, when I call this plugin, it fails:
panic: plugin.Open("test3/dll"): plugin was built with a different version of package internal/cpu

Any suggestion? Or garble don't support buildmode?

GOPRIVATE='*' results in std build failures

> env GOPRIVATE='*'
> garble build  -o bin ./standalone
[stderr]
# runtime/internal/atomic
H.go:943629617: undefined: unsafe.ZrMmYd1lg
H.go:943629618: undefined: unsafe.ZrMmYd1lg
K.go:869597725: undefined: unsafe.ZrMmYd1lg
n.go:1008063807: undefined: unsafe.ZrMmYd1lg
exit status 2
# internal/bytealg
o.go:655810508: undefined: unsafe.ZoVArZxRC
6.go:127173979: undefined: unsafe.ZoVArZxRC
exit status 2

This was spotted by @pagran on Slack a few days ago, and I've just run into it again.

figure out test code coverage

Because the tests run the real go build -toolexec=garble, we unfortunately don't get any code coverage information from go test -coverprofile.

Figure out how to fix this. We probably need to collect and merge coverage profiles ourselves.

Suppress printing panic messages

It might be useful for some developers to completely hide panic messages from ever printing. Currently this can be done for the most part by wrapping main() and each started goroutine with a defer that recovers and exits. But this does not stop panics from ever happening, as sending certain signals to a running Go binary will still cause it to panic.

I propose that garble could have the option to compile binaries that are incapable of printing panics. Control flow would be untouched, panic and recover would work as expected. If garble could just make runtime/printpanics a no-op, panics would still be available to inspect in Go code, but will never be implicitly printed by the runtime. Developers would have complete control over when panics would be printed.

Link to function in runtime: https://github.com/golang/go/blob/master/src/runtime/panic.go#L681

.dedis.ch/kyber not defined

Hi there,
I have a some strage errors:

λ garble build -ldflags "-H windowsgui" -o agent.exe cmd/agent/main.go
# command-line-arguments
go.dedis.ch/kyber/pairing/bn256.gfpNeg: relocation target go.dedis.ch/kyber/pairing/bn256.p2 not defined
go.dedis.ch/kyber/pairing/bn256.gfpAdd: relocation target go.dedis.ch/kyber/pairing/bn256.p2 not defined
go.dedis.ch/kyber/pairing/bn256.gfpSub: relocation target go.dedis.ch/kyber/pairing/bn256.p2 not defined
go.dedis.ch/kyber/pairing/bn256.gfpMul: relocation target go.dedis.ch/kyber/pairing/bn256.hasBMI2 not defined
go.dedis.ch/kyber/pairing/bn256.gfpMul: relocation target go.dedis.ch/kyber/pairing/bn256.np not defined
go.dedis.ch/kyber/pairing/bn256.gfpMul: relocation target go.dedis.ch/kyber/pairing/bn256.p2 not defined
exit status 2
exit status 2

My setup go version go1.14.1 windows/amd64

Only garble packages matching $GOPRIVATE

Obfuscating a publicly available package is a bit silly. Not only because anyone could fetch the source from proxy.golang.org, but also because it would be possible to figure out what version was used - since the tool produces reproducible output.

This would also make the tool a bit more consistent. Right now we don't garble the standard library, but we do garble modules like golang.org/x/net. This doesn't make much sense, and $GOPRIVATE would be a better mechanism.

testdata/scripts/literals.txt is wasteful

c2079ac improved the test, which is great, but it also meant that we now need to run both go build and garble build to verify the output.

This is unfortunate, because in general we only double-check with go build when -short is not used, thus making the tests noticeably cheaper and faster when one just wants to quickly iterate on the code.

This is a reminder to take another look at this. We should make the output deterministic, and re-add a file at the bottom of the test for it. If the output changes between 32 and 64 bit systems, we can work around that.

garble build fails (cgo)

Note: It is not important for me that this works, but maybe it can improve cgo support.

To reproduce follow what i did.

Clone git repo

$ git clone https://github.com/lu4p/ToRat.git
Cloning into 'ToRat'...
remote: Enumerating objects: 127, done.
remote: Counting objects: 100% (127/127), done.
remote: Compressing objects: 100% (101/101), done.
remote: Total 525 (delta 66), reused 54 (delta 22), pack-reused 398
Receiving objects: 100% (525/525), 157.65 KiB | 815.00 KiB/s, done.
Resolving deltas: 100% (246/246), done.

Change directory to server package

$ cd cmd/server/ 

Execute garble build (fails)

$ garble build -v                           
go: downloading golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980
runtime/internal/sys
unicode/utf8
math/bits
internal/cpu
internal/race
unicode
runtime/internal/atomic
sync/atomic
golang.org/x/sys/internal/unsafeheader
runtime/internal/math
container/list
crypto/internal/subtle
crypto/subtle
unicode/utf16
vendor/golang.org/x/crypto/cryptobyte/asn1
internal/bytealg
math
internal/nettrace
internal/testlog
vendor/golang.org/x/crypto/internal/subtle
runtime/cgo
encoding
runtime
internal/reflectlite
sync
internal/singleflight
math/rand
errors
sort
internal/oserror
io
strconv
vendor/golang.org/x/net/dns/dnsmessage
syscall
strings
hash
crypto/internal/randutil
bytes
text/tabwriter
reflect
crypto/rc4
crypto
crypto/hmac
hash/crc32
vendor/golang.org/x/crypto/hkdf
regexp/syntax
html
path
bufio
vendor/golang.org/x/text/transform
internal/syscall/unix
time
internal/syscall/execenv
regexp
context
internal/poll
github.com/jinzhu/inflection
os
internal/fmtsort
encoding/binary
fmt
path/filepath
os/signal
net
crypto/cipher
crypto/ed25519/internal/edwards25519
golang.org/x/sys/unix
crypto/sha512
io/ioutil
crypto/md5
crypto/sha1
crypto/sha256
encoding/base64
crypto/aes
flag
log
net/url
text/template/parse
crypto/des
math/big
encoding/hex
encoding/pem
vendor/golang.org/x/crypto/chacha20
vendor/golang.org/x/crypto/poly1305
vendor/golang.org/x/sys/cpu
vendor/golang.org/x/crypto/curve25519
github.com/flynn-archive/go-shlex
os/exec
database/sql/driver
vendor/golang.org/x/crypto/chacha20poly1305
github.com/mattn/go-isatty
text/template
encoding/json
database/sql
github.com/mattn/go-colorable
go/token
github.com/fatih/color
encoding/gob
go/scanner
compress/flate
crypto/elliptic
github.com/dimiro1/banner
encoding/asn1
crypto/rand
crypto/dsa
go/ast
crypto/ed25519
github.com/dimiro1/banner/autoload
crypto/rsa
github.com/lu4p/shred
github.com/mattn/go-sqlite3
crypto/x509/pkix
vendor/golang.org/x/crypto/cryptobyte
crypto/ecdsa
html/template
github.com/lu4p/ToRat/models
compress/gzip
vendor/golang.org/x/text/unicode/bidi
vendor/golang.org/x/text/unicode/norm
vendor/golang.org/x/net/http2/hpack
github.com/jinzhu/gorm
mime
vendor/golang.org/x/text/secure/bidirule
mime/quotedprintable
net/http/internal
github.com/abiosoft/readline
net/textproto
crypto/x509
vendor/golang.org/x/net/idna
mime/multipart
vendor/golang.org/x/net/http/httpguts
vendor/golang.org/x/net/http/httpproxy
github.com/lu4p/ToRat/torat_server/crypto
crypto/tls
github.com/abiosoft/ishell
net/http/httptrace
net/http
net/rpc
# github.com/mattn/go-sqlite3
sqlite3-binding.c: In function ‘sqlite3SelectNew’:
sqlite3-binding.c:128049:10: warning: function may return address of local variable [-Wreturn-local-addr]
128049 |   return pNew;
       |          ^~~~
sqlite3-binding.c:128009:10: note: declared here
128009 |   Select standin;
       |          ^~~~~~~
github.com/jinzhu/gorm/dialects/sqlite
github.com/lu4p/ToRat/torat_server
# github.com/lu4p/ToRat/torat_server
typecheck error: ../../torat_server/server.go:15:4: could not import github.com/jinzhu/gorm/dialects/sqlite (invalid character '#' looking for beginning of value)
exit status 2

The fail is this package https://github.com/mattn/go-sqlite3 possibly in the cgo of this file https://github.com/mattn/go-sqlite3/blob/master/sqlite3.go

Execute Normal build (succeeds)

$ go build -v -a -trimpath                
math/bits
runtime/internal/sys
unicode/utf8
internal/race
unicode
sync/atomic
internal/cpu
runtime/internal/atomic
golang.org/x/sys/internal/unsafeheader
runtime/internal/math
container/list
crypto/internal/subtle
crypto/subtle
internal/testlog
internal/bytealg
math
vendor/golang.org/x/crypto/cryptobyte/asn1
internal/nettrace
unicode/utf16
vendor/golang.org/x/crypto/internal/subtle
runtime/cgo
encoding
runtime
internal/reflectlite
sync
internal/singleflight
math/rand
errors
sort
internal/oserror
io
vendor/golang.org/x/net/dns/dnsmessage
strconv
syscall
strings
hash
crypto/internal/randutil
text/tabwriter
bytes
crypto/hmac
hash/crc32
vendor/golang.org/x/crypto/hkdf
crypto
reflect
crypto/rc4
bufio
vendor/golang.org/x/text/transform
regexp/syntax
html
path
time
internal/syscall/unix
internal/syscall/execenv
regexp
context
internal/poll
github.com/jinzhu/inflection
internal/fmtsort
os
encoding/binary
crypto/md5
crypto/ed25519/internal/edwards25519
crypto/cipher
crypto/sha512
crypto/sha1
crypto/sha256
golang.org/x/sys/unix
fmt
path/filepath
encoding/base64
net
vendor/golang.org/x/crypto/poly1305
vendor/golang.org/x/sys/cpu
crypto/aes
crypto/des
io/ioutil
encoding/pem
vendor/golang.org/x/crypto/chacha20
os/signal
os/exec
vendor/golang.org/x/crypto/chacha20poly1305
log
text/template/parse
net/url
flag
math/big
encoding/hex
vendor/golang.org/x/crypto/curve25519
github.com/flynn-archive/go-shlex
database/sql/driver
encoding/json
go/token
encoding/gob
github.com/mattn/go-isatty
text/template
database/sql
go/scanner
github.com/mattn/go-colorable
github.com/fatih/color
go/ast
compress/flate
vendor/golang.org/x/text/unicode/bidi
crypto/elliptic
github.com/dimiro1/banner
encoding/asn1
crypto/rand
crypto/dsa
github.com/jinzhu/gorm
crypto/ed25519
github.com/dimiro1/banner/autoload
crypto/rsa
github.com/mattn/go-sqlite3
github.com/lu4p/shred
compress/gzip
html/template
crypto/ecdsa
crypto/x509/pkix
vendor/golang.org/x/crypto/cryptobyte
github.com/lu4p/ToRat/models
vendor/golang.org/x/text/secure/bidirule
vendor/golang.org/x/text/unicode/norm
vendor/golang.org/x/net/http2/hpack
mime
mime/quotedprintable
net/http/internal
vendor/golang.org/x/net/idna
vendor/golang.org/x/net/http/httpproxy
net/textproto
github.com/abiosoft/readline
crypto/x509
vendor/golang.org/x/net/http/httpguts
mime/multipart
github.com/lu4p/ToRat/torat_server/crypto
crypto/tls
github.com/abiosoft/ishell
net/http/httptrace
net/http
net/rpc
# github.com/mattn/go-sqlite3
sqlite3-binding.c: In function ‘sqlite3SelectNew’:
sqlite3-binding.c:128049:10: warning: function may return address of local variable [-Wreturn-local-addr]
128049 |   return pNew;
       |          ^~~~
sqlite3-binding.c:128009:10: note: declared here
128009 |   Select standin;
       |          ^~~~~~~
github.com/jinzhu/gorm/dialects/sqlite
github.com/lu4p/ToRat/torat_server
github.com/lu4p/ToRat/cmd/server

System Information

$ go version
go version go1.14.3 linux/amd64

$ lsb_release -a  
LSB Version:    n/a
Distributor ID: ManjaroLinux
Description:    Manjaro Linux
Release:        20.0.2
Codename:       Lysia

Cache go list output

As discussed on Slack, go list can take quite a long time when listing imported packages of a large program, so the output should be cached. Because of the limit of environmental variable sizes on Windows, a temporary file should be used instead. Serialization could use encoding/gob instead of JSON to save space and processing cycles. This wouldn't be an issue if using -toolexec didn't spawn multiple processes of the tool that's being used, so in this case go list is getting run 3+ times afaik.

Obfuscate literals such as strings

Other projects like gobfuscate do this, and it seems like a feature that's generally useful to many users.

For example, this is what they do:

Strings are obfuscated by replacing them with functions. A string will be turned into an expression like the following:

(func() string {
	mask := []byte{33, 15, 199}
	maskedStr := []byte{73, 106, 190}
	res := make([]byte, 3)
	for i, m := range mask {
		res[i] = m ^ maskedStr[i]
	}
	return string(res)
}())

Reasons to do this:

  • More obfuscation takes place. The decompiled source code is less useful.
  • It's harder to locate strings in binaries via grep, or extract them easily.

Reasons not to do this:

  • No information is lost. When one runs the program, all literals are available in memory anyway. All other kinds of obfuscation we do don't have this flaw, as they remove information entirely.
  • There could be a significant performance penalty if we replace every single literal with a function to generate it. For example, if a string is used as part of a hot loop that's executed tens of thousands of times per second.

So far, I have only implemented the "remove information" kind of obfuscation, such as replacing variable names and file names, and removing module information.

As much as I like not having flags, I think that any obfuscation that has a significant performance penalty should have a flag, even if it's enabled by default. I would prefer for the flag to be disabled by default, since it should be the developer who decides whether or not the tradeoff is worth it for them.

Identifiers can have duplicate garbled names

I understand that a goal of this project is deterministic renaming of symbols or identifiers, but the way items are renamed currently make duplicate names possible.

This can aid in deobfuscastion, as it is clear that items that have the same garbled name must have the same original name as well.

I'm not sure how this should be tackled, as you mentioned in another issue that you don't want to have to generate a file that maps original names to garbled names in the future.

One method that comes to mind is using the line number the item to be hashed is on as part of the salt, but that assumes that the user ungarbling a panic or whatever knows the original line numbers of each garbled item.

Converting Hex encoded strings to []byte leads to bigger binaries

I noticed by writing https://github.com/lu4p/binclude, that []byte("\x7d\x69") doesn't get evaluated to []byte{125, 105} at compile time but only at runtime, therefore leading to bigger binaries because each hex encoded byte takes up four characters=(bytes) effectively.

I would suggest replacing https://github.com/mvdan/garble/blob/4c64b13506693b5d92f51548650441fad3c7c118/strings.go#L212 with https://github.com/lu4p/binclude/blob/427c0837fbfc6c72c88bd602ef1c16f05d597ff0/cmd/binclude/inject.go#L14

This function can handle multiple hundred Megabytes for a single []byte slice before memory usage becomes an issue, so literals should be handled just fine.

Bug literal obfuscation: garbleDecrypt shows up in obfuscated file

Currently the identifier of the injected function garbleDecrypt doesn't get obfuscated, I don't get why this is as all other identifieres even in the same function get obfuscated.

package main

import (
	"crypto/aes"
	"crypto/cipher"
)

func main() {
	println(garbleDecrypt([]byte("\xbd\x1e\xef\x0e\xc08\xd9\xd1\\Z\x9c6\x83\x8c]\xc3\x18\xca\xf3d\xbblBy<}\xeaw\xfemR\xe0\xe5^^S}\xef\r")))
}
func garbleDecrypt(zz8R2glwq []byte) string {
	zavpGIsKw, zq5L43cyy := aes.NewCipher(z3uyPF0rS)
	if zq5L43cyy != nil {
		panic("garble: literal couldn't be decrypted: " + zq5L43cyy.Error())
	}
	zNZHRXNGb, zq5L43cyy := cipher.NewGCM(zavpGIsKw)
	if zq5L43cyy != nil {
		panic("garble: literal couldn't be decrypted: " + zq5L43cyy.Error())
	}
	z0WzbQH2R, zq5L43cyy := zNZHRXNGb.Open(nil, zz8R2glwq[:12], zz8R2glwq[12:], nil)
	if zq5L43cyy != nil {
		panic("garble: literal couldn't be decrypted: " + zq5L43cyy.Error())
	}
	return string(z0WzbQH2R)
}

var z3uyPF0rS = []byte("\xa0N\xa9\xe7\b\x17\xa3\xbd\xb4\x11\x89\xfd\xd7Ё\xdd")

Add more Go commands like test, run, version, install

For example, test can be useful to check if the test suite passes when garbled, which is an important indicator to tell if garbling broke anything badly.

version can be useful to report garble's own version, on top of the version of Go.

Make obfuscating different literal types optional

Currently, the -literals flag obfuscates all strings, integer types, floating point types, and boolean types. The user should be able to specify if they want only string literals obfuscated, or only integers, etc.

build fail with CGO, is CGO supported?

Hi Daniel, is garble supports with cgo? In my case it build fails:

go build -a -trimpath -toolexec=garble
/snap/go/5569/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-188289773/go.o: In function `main.zi_MJnzaz':
go.go:(.text+0x90cd1): undefined reference to `main.zQVZn2IWD'
go.go:(.text+0x90d08): undefined reference to `main.zPxHFpqLd'
go.go:(.text+0x90d24): undefined reference to `main.zPxHFpqLd'
collect2: error: ld returned 1 exit status

here is the code:

package main

/*
#include <stdint.h>

static int32_t add(int32_t a, int32_t b) {
	return a + b;
}
*/
import "C"
import "fmt"

func main() {
	var a, b int32 = 1, 2

	var c int32 = int32(C.add(C.int32_t(a), C.int32_t(b)))

	fmt.Println("add", c)
}

my environment:

$ go version
go version go1.14.1 linux/amd64

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

buildmode plugin issue of package not found

The files as follows:

go.mod

module test.com/plugin

go 1.14

dll/dll.go

package dll

import (
	"fmt"
)

type DllInfo struct {
	Name string `json:"name"`
	Id   int32  `json:"id"`
}

func TestDll(name string, id int32) {
	fmt.Printf("check : %v\n", &DllInfo{name, id})
}

main.go

package main

import (
	"test.com/plugin/dll"
)

var TestDll = dll.TestDll

func main() {
	TestDll("asdasfas %v", 111)
}

Then run command:

garble build -buildmode=plugin -o dll.so main.go

Get the errors:

# command-line-arguments
main.go:7:15: undefined: dll.TestDll
exit status 2
exit status 2

It really weird... Seems can not find the package.

literal obfuscation can't depend on AES

Our current literal obfuscation (i.e. strings) makes use of AES, so we need to add those imports if the package doesn't import them. That's done here: https://github.com/mvdan/garble/blob/47b1bc8e6a19ac073e40756749c4ede85e1f289c/main.go#L579-L605

And it works, mostly. It was always kind of a hack.

After @capnspacehook fixed #50, I started getting failures on master with Go tip (1.15). Note that this version of Go comes with a new linker, which is better, but also has more sanity checks:

$ go test -short
--- FAIL: TestScripts (0.03s)
    --- FAIL: TestScripts/seed (12.60s)
        testscript.go:382: 
            # Check the binary with a given base64 encoded seed (12.604s)
            > garble -literals -seed=OQg9kACEECQ= build
            [stderr]
            # test/main
            /home/mvdan/tip/pkg/tool/linux_amd64/link: fingerprint mismatch: runtime has 8a55d8a40b33c500, import from internal/reflectlite expecting 07278dd9886cf356
            exit status 2
            exit status 2
            [exit status 1]
            FAIL: testdata/scripts/seed.txt:2: unexpected command failure
            
    --- FAIL: TestScripts/strings (13.06s)
        testscript.go:382: 
            > garble -literals build
            [stderr]
            # test/main
            /home/mvdan/tip/pkg/tool/linux_amd64/link: fingerprint mismatch: runtime has 8a55d8a40b33c500, import from internal/reflectlite expecting 07278dd9886cf356
            exit status 2
            exit status 2
            [exit status 1]
            FAIL: testdata/scripts/strings.txt:2: unexpected command failure
            
FAIL
exit status 1
FAIL	mvdan.cc/garble	19.441s
$ go version
go version devel +4f2a2d7e26 Wed Jul 8 22:16:24 2020 +0000 linux/amd64

And indeed, if I revert 7ede37c, the issue disappears.

However, I will argue that his change isn't to blame; rather, our hackery to add AES as a dependency is the culprit. Note that, above, it's only the tests that use -literals that fail.

To further confirm that theory, if one removes AES entirely from the picture with the patch below, the problem goes away:

diff --git a/main.go b/main.go
index c2acd11..a3bde63 100644
--- a/main.go
+++ b/main.go
@@ -578,8 +578,6 @@ func readBuildIDs(flags []string) error {
 	// TODO: this means these packages can't be garbled. never garble std?
 	if envGarbleLiterals {
 		toAdd := []string{
-			"crypto/aes",
-			"crypto/cipher",
 		}
 		for len(toAdd) > 0 {
 			// Use a stack, to reuse memory.
diff --git a/strings.go b/strings.go
index bc2e1de..f5cd7b9 100644
--- a/strings.go
+++ b/strings.go
@@ -126,8 +126,6 @@ func obfuscateLiterals(files []*ast.File, info *types.Info, blacklist map[types.
 			}
 			x.Decls = append(x.Decls, funcStmt)
 			x.Decls = append(x.Decls, keyStmt(key))
-			astutil.AddImport(fset, x, "crypto/aes")
-			astutil.AddImport(fset, x, "crypto/cipher")
 
 			addedToPkg = true
 		case *ast.BasicLit:
@@ -227,7 +225,7 @@ var (
 	returnStmt = &ast.ReturnStmt{Results: []ast.Expr{
 		&ast.CallExpr{
 			Fun:  &ast.Ident{Name: "string"},
-			Args: []ast.Expr{&ast.Ident{Name: "plaintext"}},
+			Args: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: `""`}},
 		},
 	}}
 )
@@ -272,12 +270,6 @@ var funcStmt = &ast.FuncDecl{
 		}}},
 	},
 	Body: &ast.BlockStmt{List: []ast.Stmt{
-		aesCipherStmt,
-		decErrStmt(),
-		aesGcmCipherStmt,
-		decErrStmt(),
-		plaintextStmt,
-		decErrStmt(),
 		returnStmt,
 	}},
 }

So here is what I think is happening:

  1. Compilation happens from bottom to top; all dependencies must be compiled before a package itself is compiled.
  2. We obfuscate packages at compile time only.
  3. If a package needs to obfuscate literals but doesn't import AES, we add the relevant imports.
  4. However, because we're already late at compiling and obfuscating those packages, we don't obfuscate them.
  5. At link time, we point the linker at the object files for crypto/aes and friends from the regular build cache, in non-garbled form
  6. Those object files end up pointing at other object files, and finally into the object file for runtime (everything depends on it)
  7. Since we garble the runtime package (to add the extra API), the linker ends up with two versions of the runtime package, with conflicting fingerprints.

You could say that modifying the runtime is bad, but it serves a good purpose, and after all it's like modifying any other package matched by GOPRIVATE. The outlier here is the injection of crypto/aes as a dependency when it's too late, which is catastrophic. Doing it early could possibly be doable, but it would need a lot of tricky code, which isn't worth it. Given that we're already thinking of redesigning literal obfuscation in #57, I'm raising this bug to both show my findings, and to show support towards removing AES.

Allow easily inspecting the garbled code

Right now, while developing garble itself, it's hard to see how the garbled code differs from the original. What I tend to do is add debug printing right into the tool.

We should add a flag to make this accessible by all users. A nice idea by @digitalhurricane-io was to provide a directory where the garbled code is written, so that the user can inspect it however they want.

I propose that the directory be written in the form of a GOPATH or vendor tree; for example, when we obfuscate the package foo.com/bar, its garbled files could be written to somedir/foo.com/bar/*.go.

We can bikeshed about the flag name. -save, -debugdir, et cetera.

Support Go plugins

When a main go binary and a plugin are build through gradle with a common private import, i end up having an error message when loading the plugin :

plugin was built with a different version of package xxx.

Is it possible somehow to reuse previous build or im doing something wrong ?

Be smarter about which methods can have their names changed

Changing all method names will break some programs, as method names are necessary to implement interfaces.

On the otherhand, not touching any method names exposes far too much information. It's likely that only a minority of methods actually implement interfaces.

Of course, this is a difficult problem to solve, because for a library package it's impossible to tell which methods are meant to implement which interfaces. Perhaps it's only a package that imports our library which uses a type as an interface with methods, since a type doesn't have to be upfront about what interfaces it implements.

We implemented a conservative version of this algorithm for https://github.com/mvdan/unparam, so perhaps we can reuse it.

Right now, we grable method names only if they are unexported, which is a reasonable shortcut until we have a better mechanism.

garble build fails: due to undefined NopResetter and undefined BasicTabler

To reproduce follow what i did.

Clone git repo

$ git clone https://github.com/lu4p/cat.git                                          
Cloning into 'cat'...
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 306 (delta 9), reused 15 (delta 5), pack-reused 271
Receiving objects: 100% (306/306), 205.30 KiB | 811.00 KiB/s, done.
Resolving deltas: 100% (149/149), done.

Change directory to main package

$ cd cat/cmd/cat/ 

Execute garble build (fails)

$ go build -v -a -trimpath -toolexec=garble                        
math/bits
runtime/internal/sys
internal/race
unicode/utf8
unicode
internal/cpu
sync/atomic
runtime/internal/atomic
encoding
runtime/internal/math
crypto/internal/subtle
crypto/subtle
image/color
unicode/utf16
github.com/lu4p/unipdf/v3/internal/sampling
internal/testlog
golang.org/x/text/encoding/internal/identifier
internal/bytealg
math
image/color/palette
runtime
internal/reflectlite
sync
math/rand
errors
sort
io
internal/oserror
strconv
github.com/lu4p/unipdf/v3/internal/ccittfax
syscall
hash
bytes
github.com/lu4p/unipdf/v3/internal/jbig2/writer
strings
hash/adler32
hash/crc32
crypto
reflect
crypto/rc4
bufio
golang.org/x/text/transform
path
regexp/syntax
github.com/EndFirstCorp/peekingReader
image
internal/syscall/unix
time
regexp
image/internal/imageutil
image/draw
image/jpeg
# golang.org/x/text/transform
/tmp/garble-build511050890/z0.go:164:24: undefined: NopResetter
/tmp/garble-build511050890/z0.go:177:24: undefined: NopResetter
exit status 2
internal/poll
os
internal/fmtsort
encoding/binary
runtime/debug
path/filepath
fmt
crypto/sha256
encoding/base64
crypto/md5
crypto/cipher
crypto/sha512
io/ioutil
github.com/lu4p/cat/plaintxt
crypto/aes
github.com/gabriel-vasile/mimetype/internal/json
mime
encoding/csv
compress/flate
debug/dwarf
encoding/xml
github.com/lu4p/unipdf/v3/common
encoding/hex
compress/lzw
math/big
golang.org/x/image/tiff/lzw
compress/zlib
archive/zip
compress/gzip
image/gif
github.com/lu4p/unipdf/v3/internal/cmap/bcmaps
image/png
github.com/lu4p/cat/rtftxt
github.com/lu4p/cat/docxtxt
debug/macho
github.com/lu4p/cat/odtxt
github.com/gabriel-vasile/mimetype/internal/matchers
log
crypto/rand
github.com/lu4p/unipdf/v3/core/security
github.com/lu4p/unipdf/v3/internal/jbig2/bitmap
github.com/lu4p/unipdf/v3/internal/jbig2/reader
github.com/lu4p/unipdf/v3/internal/strutils
github.com/lu4p/unipdf/v3/internal/transform
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/arithmetic
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/huffman
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/mmr
github.com/gabriel-vasile/mimetype
# github.com/lu4p/unipdf/v3/internal/jbig2/decoder/huffman
/tmp/garble-build300005846/z1.go:10:2: undefined: BasicTabler
exit status 2
github.com/lu4p/unipdf/v3/core/security/crypt

The Type causing the first fail is an empty struct: https://github.com/golang/text/blob/master/transform/transform.go#L104

Second fail is caues by this Interface type: https://github.com/lu4p/unipdf/blob/master/internal/jbig2/decoder/huffman/table.go#L24

Execute Normal build (succeeds)

$ go build -v -a -trimpath                                       
runtime/internal/sys
math/bits
internal/race
unicode/utf8
unicode
internal/cpu
sync/atomic
runtime/internal/atomic
encoding
crypto/internal/subtle
runtime/internal/math
crypto/subtle
image/color
unicode/utf16
github.com/lu4p/unipdf/v3/internal/sampling
internal/testlog
golang.org/x/text/encoding/internal/identifier
internal/bytealg
math
image/color/palette
runtime
internal/reflectlite
sync
math/rand
errors
sort
io
internal/oserror
github.com/lu4p/unipdf/v3/internal/ccittfax
strconv
syscall
bytes
hash
github.com/lu4p/unipdf/v3/internal/jbig2/writer
strings
hash/adler32
hash/crc32
crypto
crypto/rc4
reflect
golang.org/x/text/transform
bufio
regexp/syntax
path
golang.org/x/text/encoding
github.com/EndFirstCorp/peekingReader
image
internal/syscall/unix
time
regexp
image/internal/imageutil
image/jpeg
image/draw
internal/poll
os
internal/fmtsort
encoding/binary
encoding/base64
crypto/cipher
crypto/sha256
crypto/sha512
crypto/md5
runtime/debug
path/filepath
fmt
crypto/aes
io/ioutil
github.com/lu4p/cat/plaintxt
github.com/gabriel-vasile/mimetype/internal/json
encoding/hex
github.com/lu4p/unipdf/v3/common
mime
encoding/csv
compress/flate
encoding/xml
debug/dwarf
compress/lzw
math/big
github.com/lu4p/unipdf/v3/internal/jbig2/bitmap
github.com/lu4p/unipdf/v3/internal/jbig2/reader
github.com/lu4p/unipdf/v3/internal/strutils
golang.org/x/image/tiff/lzw
github.com/lu4p/unipdf/v3/internal/transform
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/arithmetic
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/huffman
github.com/lu4p/unipdf/v3/internal/jbig2/decoder/mmr
image/gif
archive/zip
compress/zlib
compress/gzip
github.com/lu4p/unipdf/v3/internal/jbig2/segments
image/png
golang.org/x/text/unicode/norm
debug/macho
github.com/lu4p/cat/rtftxt
github.com/lu4p/unipdf/v3/internal/cmap/bcmaps
github.com/lu4p/cat/docxtxt
github.com/lu4p/cat/odtxt
log
github.com/gabriel-vasile/mimetype/internal/matchers
crypto/rand
github.com/lu4p/unipdf/v3/core/security
github.com/lu4p/unipdf/v3/internal/jbig2
github.com/lu4p/unipdf/v3/core/security/crypt
github.com/gabriel-vasile/mimetype
github.com/lu4p/unipdf/v3/core
github.com/lu4p/unipdf/v3/internal/cmap
github.com/lu4p/unipdf/v3/ps
github.com/lu4p/unipdf/v3/internal/textencoding
github.com/lu4p/unipdf/v3/model/internal/fonts
github.com/lu4p/unipdf/v3/model
github.com/lu4p/unipdf/v3/contentstream
github.com/lu4p/unipdf/v3/extractor
github.com/lu4p/cat/pdftxt
github.com/lu4p/cat
github.com/lu4p/cat/cmd/cat

System Information

$ go version
go version go1.14 linux/amd64

$ lsb_release -a  
LSB Version:	n/a
Distributor ID:	ManjaroLinux
Description:	Manjaro Linux
Release:	19.0.2
Codename:	Kyria

Garble the order of top-level definitions

The order in which a package's top-level definitions (funcs, vars, consts) are laid out is useful to humans, and conveys information. For example, the higher-level functions tend to be at the top, so you can read the source more easily from top to bottom.

We should randomize this order, to remove that information.

Condition obfuscation [idea]

I propose to actively use lambdas and channels since they generate a lot of boilerplate code in the output binary. For example, you can obfuscate any if stmt:

Original code:

if os.Getpid()%2 == 0 || os.Getpid()%3 == 0 {
	println("lucky pid", os.Getpid())
} else {
	println("unlucky pid", os.Getpid())
}

Step 1:

if (func() bool {
	return os.Getpid()%2 == 0 || os.Getpid()%3 == 0
})() {
	println("lucky pid", os.Getpid())
} else {
	println("unlucky pid", os.Getpid())
}

Step 2:

if (func() bool {
	c := make(chan bool, 2)
	go func() {
		c <- os.Getpid()%2 == 0
		c <- os.Getpid()%3 == 0
	}()
	return <-c || <-c
})() {
	println("lucky pid", os.Getpid())
} else {
	println("unlucky pid", os.Getpid())
}

Just try load output binaru into ida pro ;)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.