gitextract_czb9adhq/ ├── 12fa-docker-golang/ │ ├── README.md │ ├── chapter1/ │ │ ├── apiservice/ │ │ │ └── apiservice.go │ │ ├── main.go │ │ ├── run │ │ ├── subpackage1.go │ │ └── vendor/ │ │ ├── github.com/ │ │ │ └── namsral/ │ │ │ └── flag/ │ │ │ ├── LICENSE │ │ │ ├── examples/ │ │ │ │ └── gopher.go │ │ │ └── flag.go │ │ └── manifest │ ├── chapter11/ │ │ ├── main.go │ │ ├── run │ │ └── vendor/ │ │ ├── github.com/ │ │ │ ├── apex/ │ │ │ │ └── log/ │ │ │ │ ├── LICENSE │ │ │ │ ├── default.go │ │ │ │ ├── doc.go │ │ │ │ ├── entry.go │ │ │ │ ├── handlers/ │ │ │ │ │ ├── cli/ │ │ │ │ │ │ └── cli.go │ │ │ │ │ ├── discard/ │ │ │ │ │ │ └── discard.go │ │ │ │ │ ├── es/ │ │ │ │ │ │ └── es.go │ │ │ │ │ ├── graylog/ │ │ │ │ │ │ └── graylog.go │ │ │ │ │ ├── json/ │ │ │ │ │ │ └── json.go │ │ │ │ │ ├── kinesis/ │ │ │ │ │ │ └── kinesis.go │ │ │ │ │ ├── level/ │ │ │ │ │ │ └── level.go │ │ │ │ │ ├── logfmt/ │ │ │ │ │ │ └── logfmt.go │ │ │ │ │ ├── memory/ │ │ │ │ │ │ └── memory.go │ │ │ │ │ ├── multi/ │ │ │ │ │ │ └── multi.go │ │ │ │ │ ├── papertrail/ │ │ │ │ │ │ └── papertrail.go │ │ │ │ │ └── text/ │ │ │ │ │ └── text.go │ │ │ │ ├── interface.go │ │ │ │ ├── levels.go │ │ │ │ ├── logger.go │ │ │ │ ├── pkg.go │ │ │ │ └── stack.go │ │ │ ├── aphistic/ │ │ │ │ └── golf/ │ │ │ │ ├── LICENSE │ │ │ │ ├── chunker.go │ │ │ │ ├── client.go │ │ │ │ ├── json.go │ │ │ │ ├── log.go │ │ │ │ ├── log_default.go │ │ │ │ ├── logger.go │ │ │ │ ├── main.go │ │ │ │ └── message.go │ │ │ ├── aws/ │ │ │ │ └── aws-sdk-go/ │ │ │ │ ├── aws/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── awserr/ │ │ │ │ │ │ ├── error.go │ │ │ │ │ │ └── types.go │ │ │ │ │ ├── awsutil/ │ │ │ │ │ │ ├── copy.go │ │ │ │ │ │ ├── equal.go │ │ │ │ │ │ ├── path_value.go │ │ │ │ │ │ ├── prettify.go │ │ │ │ │ │ └── string_value.go │ │ │ │ │ ├── client/ │ │ │ │ │ │ ├── client.go │ │ │ │ │ │ ├── default_retryer.go │ │ │ │ │ │ └── metadata/ │ │ │ │ │ │ └── client_info.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── context.go │ │ │ │ │ ├── context_1_6.go │ │ │ │ │ ├── context_1_7.go │ │ │ │ │ ├── convert_types.go │ │ │ │ │ ├── corehandlers/ │ │ │ │ │ │ ├── handlers.go │ │ │ │ │ │ └── param_validator.go │ │ │ │ │ ├── credentials/ │ │ │ │ │ │ ├── chain_provider.go │ │ │ │ │ │ ├── credentials.go │ │ │ │ │ │ ├── ec2rolecreds/ │ │ │ │ │ │ │ └── ec2_role_provider.go │ │ │ │ │ │ ├── endpointcreds/ │ │ │ │ │ │ │ └── provider.go │ │ │ │ │ │ ├── env_provider.go │ │ │ │ │ │ ├── shared_credentials_provider.go │ │ │ │ │ │ ├── static_provider.go │ │ │ │ │ │ └── stscreds/ │ │ │ │ │ │ └── assume_role_provider.go │ │ │ │ │ ├── defaults/ │ │ │ │ │ │ └── defaults.go │ │ │ │ │ ├── ec2metadata/ │ │ │ │ │ │ ├── api.go │ │ │ │ │ │ └── service.go │ │ │ │ │ ├── endpoints/ │ │ │ │ │ │ ├── decode.go │ │ │ │ │ │ ├── defaults.go │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── endpoints.go │ │ │ │ │ │ ├── v3model.go │ │ │ │ │ │ └── v3model_codegen.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── jsonvalue.go │ │ │ │ │ ├── logger.go │ │ │ │ │ ├── request/ │ │ │ │ │ │ ├── handlers.go │ │ │ │ │ │ ├── http_request.go │ │ │ │ │ │ ├── offset_reader.go │ │ │ │ │ │ ├── request.go │ │ │ │ │ │ ├── request_1_7.go │ │ │ │ │ │ ├── request_1_8.go │ │ │ │ │ │ ├── request_context.go │ │ │ │ │ │ ├── request_context_1_6.go │ │ │ │ │ │ ├── request_pagination.go │ │ │ │ │ │ ├── retryer.go │ │ │ │ │ │ ├── serialization_error.go │ │ │ │ │ │ ├── serialization_error_appengine.go │ │ │ │ │ │ ├── timeout_read_closer.go │ │ │ │ │ │ ├── validation.go │ │ │ │ │ │ └── waiter.go │ │ │ │ │ ├── session/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── env_config.go │ │ │ │ │ │ ├── session.go │ │ │ │ │ │ └── shared_config.go │ │ │ │ │ ├── signer/ │ │ │ │ │ │ └── v4/ │ │ │ │ │ │ ├── header_rules.go │ │ │ │ │ │ ├── options.go │ │ │ │ │ │ ├── uri_path.go │ │ │ │ │ │ └── v4.go │ │ │ │ │ ├── types.go │ │ │ │ │ ├── url.go │ │ │ │ │ ├── url_1_7.go │ │ │ │ │ └── version.go │ │ │ │ ├── private/ │ │ │ │ │ └── protocol/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── ec2query/ │ │ │ │ │ │ ├── build.go │ │ │ │ │ │ └── unmarshal.go │ │ │ │ │ ├── idempotency.go │ │ │ │ │ ├── json/ │ │ │ │ │ │ └── jsonutil/ │ │ │ │ │ │ ├── build.go │ │ │ │ │ │ └── unmarshal.go │ │ │ │ │ ├── jsonrpc/ │ │ │ │ │ │ └── jsonrpc.go │ │ │ │ │ ├── query/ │ │ │ │ │ │ ├── build.go │ │ │ │ │ │ ├── queryutil/ │ │ │ │ │ │ │ └── queryutil.go │ │ │ │ │ │ ├── unmarshal.go │ │ │ │ │ │ └── unmarshal_error.go │ │ │ │ │ ├── rest/ │ │ │ │ │ │ ├── build.go │ │ │ │ │ │ ├── payload.go │ │ │ │ │ │ └── unmarshal.go │ │ │ │ │ ├── restjson/ │ │ │ │ │ │ └── restjson.go │ │ │ │ │ ├── restxml/ │ │ │ │ │ │ └── restxml.go │ │ │ │ │ ├── unmarshal.go │ │ │ │ │ └── xml/ │ │ │ │ │ └── xmlutil/ │ │ │ │ │ ├── build.go │ │ │ │ │ ├── unmarshal.go │ │ │ │ │ └── xml_to_struct.go │ │ │ │ ├── service/ │ │ │ │ │ ├── kinesis/ │ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ │ ├── api.go │ │ │ │ │ │ ├── customizations.go │ │ │ │ │ │ ├── errors.go │ │ │ │ │ │ ├── kinesisiface/ │ │ │ │ │ │ │ └── interface.go │ │ │ │ │ │ ├── service.go │ │ │ │ │ │ └── waiters.go │ │ │ │ │ └── sts/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── api.go │ │ │ │ │ ├── customizations.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── service.go │ │ │ │ │ └── stsiface/ │ │ │ │ │ └── interface.go │ │ │ │ └── vendor/ │ │ │ │ └── github.com/ │ │ │ │ ├── go-ini/ │ │ │ │ │ └── ini/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── error.go │ │ │ │ │ ├── ini.go │ │ │ │ │ ├── key.go │ │ │ │ │ ├── parser.go │ │ │ │ │ ├── section.go │ │ │ │ │ └── struct.go │ │ │ │ └── jmespath/ │ │ │ │ └── go-jmespath/ │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api.go │ │ │ │ ├── astnodetype_string.go │ │ │ │ ├── functions.go │ │ │ │ ├── fuzz/ │ │ │ │ │ └── jmespath.go │ │ │ │ ├── interpreter.go │ │ │ │ ├── lexer.go │ │ │ │ ├── parser.go │ │ │ │ ├── toktype_string.go │ │ │ │ └── util.go │ │ │ ├── go-logfmt/ │ │ │ │ └── logfmt/ │ │ │ │ ├── LICENSE │ │ │ │ ├── decode.go │ │ │ │ ├── doc.go │ │ │ │ ├── encode.go │ │ │ │ ├── fuzz.go │ │ │ │ └── jsonstring.go │ │ │ ├── jpillora/ │ │ │ │ └── backoff/ │ │ │ │ ├── LICENSE │ │ │ │ └── backoff.go │ │ │ ├── kr/ │ │ │ │ └── logfmt/ │ │ │ │ ├── decode.go │ │ │ │ ├── scanner.go │ │ │ │ └── unquote.go │ │ │ ├── pkg/ │ │ │ │ └── errors/ │ │ │ │ ├── LICENSE │ │ │ │ ├── errors.go │ │ │ │ └── stack.go │ │ │ ├── rogpeppe/ │ │ │ │ └── fastuuid/ │ │ │ │ ├── LICENSE │ │ │ │ └── uuid.go │ │ │ ├── satori/ │ │ │ │ └── go.uuid/ │ │ │ │ ├── LICENSE │ │ │ │ └── uuid.go │ │ │ └── tj/ │ │ │ ├── go-elastic/ │ │ │ │ └── batch/ │ │ │ │ └── batch.go │ │ │ └── go-kinesis/ │ │ │ ├── LICENSE │ │ │ ├── config.go │ │ │ └── kinesis.go │ │ └── manifest │ ├── chapter2/ │ │ ├── run │ │ └── vendor/ │ │ ├── github.com/ │ │ │ └── namsral/ │ │ │ └── flag/ │ │ │ ├── LICENSE │ │ │ ├── examples/ │ │ │ │ └── gopher.go │ │ │ └── flag.go │ │ └── manifest │ ├── chapter3/ │ │ ├── flags/ │ │ │ ├── flags.go │ │ │ ├── run │ │ │ └── vendor/ │ │ │ ├── github.com/ │ │ │ │ └── namsral/ │ │ │ │ └── flag/ │ │ │ │ ├── LICENSE │ │ │ │ ├── examples/ │ │ │ │ │ └── gopher.go │ │ │ │ ├── extras.go │ │ │ │ └── flag.go │ │ │ └── manifest │ │ ├── godotenv/ │ │ │ ├── flags.go │ │ │ ├── run │ │ │ └── vendor/ │ │ │ ├── github.com/ │ │ │ │ ├── joho/ │ │ │ │ │ └── godotenv/ │ │ │ │ │ ├── LICENCE │ │ │ │ │ ├── autoload/ │ │ │ │ │ │ └── autoload.go │ │ │ │ │ ├── cmd/ │ │ │ │ │ │ └── godotenv/ │ │ │ │ │ │ └── cmd.go │ │ │ │ │ └── godotenv.go │ │ │ │ └── namsral/ │ │ │ │ └── flag/ │ │ │ │ ├── LICENSE │ │ │ │ ├── examples/ │ │ │ │ │ └── gopher.go │ │ │ │ ├── extras.go │ │ │ │ └── flag.go │ │ │ └── manifest │ │ └── viper/ │ │ ├── main.go │ │ ├── run │ │ ├── run_with_env │ │ └── vendor/ │ │ ├── github.com/ │ │ │ ├── armon/ │ │ │ │ └── consul-api/ │ │ │ │ ├── LICENSE │ │ │ │ ├── acl.go │ │ │ │ ├── agent.go │ │ │ │ ├── api.go │ │ │ │ ├── catalog.go │ │ │ │ ├── event.go │ │ │ │ ├── health.go │ │ │ │ ├── kv.go │ │ │ │ ├── session.go │ │ │ │ └── status.go │ │ │ ├── coreos/ │ │ │ │ └── go-etcd/ │ │ │ │ └── etcd/ │ │ │ │ ├── LICENSE │ │ │ │ ├── add_child.go │ │ │ │ ├── client.go │ │ │ │ ├── cluster.go │ │ │ │ ├── compare_and_delete.go │ │ │ │ ├── compare_and_swap.go │ │ │ │ ├── debug.go │ │ │ │ ├── delete.go │ │ │ │ ├── error.go │ │ │ │ ├── get.go │ │ │ │ ├── member.go │ │ │ │ ├── options.go │ │ │ │ ├── requests.go │ │ │ │ ├── response.generated.go │ │ │ │ ├── response.go │ │ │ │ ├── set_update_create.go │ │ │ │ ├── shuffle.go │ │ │ │ ├── version.go │ │ │ │ └── watch.go │ │ │ ├── fsnotify/ │ │ │ │ └── fsnotify/ │ │ │ │ ├── LICENSE │ │ │ │ ├── fen.go │ │ │ │ ├── fsnotify.go │ │ │ │ ├── inotify.go │ │ │ │ ├── inotify_poller.go │ │ │ │ ├── kqueue.go │ │ │ │ ├── open_mode_bsd.go │ │ │ │ ├── open_mode_darwin.go │ │ │ │ └── windows.go │ │ │ ├── hashicorp/ │ │ │ │ └── hcl/ │ │ │ │ ├── LICENSE │ │ │ │ ├── decoder.go │ │ │ │ ├── hcl/ │ │ │ │ │ ├── ast/ │ │ │ │ │ │ ├── ast.go │ │ │ │ │ │ └── walk.go │ │ │ │ │ ├── fmtcmd/ │ │ │ │ │ │ └── fmtcmd.go │ │ │ │ │ ├── parser/ │ │ │ │ │ │ ├── error.go │ │ │ │ │ │ └── parser.go │ │ │ │ │ ├── printer/ │ │ │ │ │ │ ├── nodes.go │ │ │ │ │ │ └── printer.go │ │ │ │ │ ├── scanner/ │ │ │ │ │ │ └── scanner.go │ │ │ │ │ ├── strconv/ │ │ │ │ │ │ └── quote.go │ │ │ │ │ └── token/ │ │ │ │ │ ├── position.go │ │ │ │ │ └── token.go │ │ │ │ ├── hcl.go │ │ │ │ ├── json/ │ │ │ │ │ ├── parser/ │ │ │ │ │ │ ├── flatten.go │ │ │ │ │ │ └── parser.go │ │ │ │ │ ├── scanner/ │ │ │ │ │ │ └── scanner.go │ │ │ │ │ └── token/ │ │ │ │ │ ├── position.go │ │ │ │ │ └── token.go │ │ │ │ ├── lex.go │ │ │ │ ├── parse.go │ │ │ │ └── testhelper/ │ │ │ │ └── unix2dos.go │ │ │ ├── kr/ │ │ │ │ └── fs/ │ │ │ │ ├── LICENSE │ │ │ │ ├── filesystem.go │ │ │ │ └── walk.go │ │ │ ├── magiconair/ │ │ │ │ └── properties/ │ │ │ │ ├── LICENSE │ │ │ │ ├── assert/ │ │ │ │ │ └── assert.go │ │ │ │ ├── decode.go │ │ │ │ ├── doc.go │ │ │ │ ├── integrate.go │ │ │ │ ├── lex.go │ │ │ │ ├── load.go │ │ │ │ ├── parser.go │ │ │ │ ├── properties.go │ │ │ │ └── rangecheck.go │ │ │ ├── mitchellh/ │ │ │ │ └── mapstructure/ │ │ │ │ ├── LICENSE │ │ │ │ ├── decode_hooks.go │ │ │ │ ├── error.go │ │ │ │ └── mapstructure.go │ │ │ ├── pelletier/ │ │ │ │ ├── go-buffruneio/ │ │ │ │ │ └── buffruneio.go │ │ │ │ └── go-toml/ │ │ │ │ ├── LICENSE │ │ │ │ ├── cmd/ │ │ │ │ │ ├── test_program.go │ │ │ │ │ ├── tomljson/ │ │ │ │ │ │ └── main.go │ │ │ │ │ └── tomll/ │ │ │ │ │ └── main.go │ │ │ │ ├── doc.go │ │ │ │ ├── keysparsing.go │ │ │ │ ├── lexer.go │ │ │ │ ├── marshal.go │ │ │ │ ├── match.go │ │ │ │ ├── parser.go │ │ │ │ ├── position.go │ │ │ │ ├── query.go │ │ │ │ ├── querylexer.go │ │ │ │ ├── queryparser.go │ │ │ │ ├── token.go │ │ │ │ ├── toml.go │ │ │ │ ├── tomltree_create.go │ │ │ │ └── tomltree_write.go │ │ │ ├── pkg/ │ │ │ │ ├── errors/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── errors.go │ │ │ │ │ └── stack.go │ │ │ │ └── sftp/ │ │ │ │ ├── LICENSE │ │ │ │ ├── attrs.go │ │ │ │ ├── attrs_stubs.go │ │ │ │ ├── attrs_unix.go │ │ │ │ ├── client.go │ │ │ │ ├── conn.go │ │ │ │ ├── debug.go │ │ │ │ ├── examples/ │ │ │ │ │ ├── buffered-read-benchmark/ │ │ │ │ │ │ └── main.go │ │ │ │ │ ├── buffered-write-benchmark/ │ │ │ │ │ │ └── main.go │ │ │ │ │ ├── request-server/ │ │ │ │ │ │ └── main.go │ │ │ │ │ ├── sftp-server/ │ │ │ │ │ │ └── main.go │ │ │ │ │ ├── streaming-read-benchmark/ │ │ │ │ │ │ └── main.go │ │ │ │ │ └── streaming-write-benchmark/ │ │ │ │ │ └── main.go │ │ │ │ ├── match.go │ │ │ │ ├── packet-manager.go │ │ │ │ ├── packet-manager_go1.8.go │ │ │ │ ├── packet-manager_legacy.go │ │ │ │ ├── packet-typing.go │ │ │ │ ├── packet.go │ │ │ │ ├── release.go │ │ │ │ ├── request-example.go │ │ │ │ ├── request-interfaces.go │ │ │ │ ├── request-server.go │ │ │ │ ├── request-unix.go │ │ │ │ ├── request.go │ │ │ │ ├── request_windows.go │ │ │ │ ├── server.go │ │ │ │ ├── server_standalone/ │ │ │ │ │ └── main.go │ │ │ │ ├── server_statvfs_darwin.go │ │ │ │ ├── server_statvfs_impl.go │ │ │ │ ├── server_statvfs_linux.go │ │ │ │ ├── server_statvfs_stubs.go │ │ │ │ ├── server_stubs.go │ │ │ │ ├── server_unix.go │ │ │ │ └── sftp.go │ │ │ ├── spf13/ │ │ │ │ ├── afero/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── afero.go │ │ │ │ │ ├── basepath.go │ │ │ │ │ ├── cacheOnReadFs.go │ │ │ │ │ ├── const_bsds.go │ │ │ │ │ ├── const_win_unix.go │ │ │ │ │ ├── copyOnWriteFs.go │ │ │ │ │ ├── httpFs.go │ │ │ │ │ ├── ioutil.go │ │ │ │ │ ├── mem/ │ │ │ │ │ │ ├── dir.go │ │ │ │ │ │ ├── dirmap.go │ │ │ │ │ │ └── file.go │ │ │ │ │ ├── memmap.go │ │ │ │ │ ├── memradix.go │ │ │ │ │ ├── os.go │ │ │ │ │ ├── path.go │ │ │ │ │ ├── readonlyfs.go │ │ │ │ │ ├── regexpfs.go │ │ │ │ │ ├── sftpfs/ │ │ │ │ │ │ ├── file.go │ │ │ │ │ │ └── sftp.go │ │ │ │ │ ├── unionFile.go │ │ │ │ │ └── util.go │ │ │ │ ├── cast/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── cast.go │ │ │ │ │ └── caste.go │ │ │ │ ├── jwalterweatherman/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── default_notepad.go │ │ │ │ │ ├── log_counter.go │ │ │ │ │ └── notepad.go │ │ │ │ ├── pflag/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── bool.go │ │ │ │ │ ├── bool_slice.go │ │ │ │ │ ├── count.go │ │ │ │ │ ├── duration.go │ │ │ │ │ ├── flag.go │ │ │ │ │ ├── float32.go │ │ │ │ │ ├── float64.go │ │ │ │ │ ├── golangflag.go │ │ │ │ │ ├── int.go │ │ │ │ │ ├── int32.go │ │ │ │ │ ├── int64.go │ │ │ │ │ ├── int8.go │ │ │ │ │ ├── int_slice.go │ │ │ │ │ ├── ip.go │ │ │ │ │ ├── ip_slice.go │ │ │ │ │ ├── ipmask.go │ │ │ │ │ ├── ipnet.go │ │ │ │ │ ├── string.go │ │ │ │ │ ├── string_array.go │ │ │ │ │ ├── string_slice.go │ │ │ │ │ ├── uint.go │ │ │ │ │ ├── uint16.go │ │ │ │ │ ├── uint32.go │ │ │ │ │ ├── uint64.go │ │ │ │ │ ├── uint8.go │ │ │ │ │ └── uint_slice.go │ │ │ │ └── viper/ │ │ │ │ ├── LICENSE │ │ │ │ ├── flags.go │ │ │ │ ├── remote/ │ │ │ │ │ └── remote.go │ │ │ │ ├── util.go │ │ │ │ └── viper.go │ │ │ ├── ugorji/ │ │ │ │ └── go/ │ │ │ │ └── codec/ │ │ │ │ ├── 0doc.go │ │ │ │ ├── LICENSE │ │ │ │ ├── binc.go │ │ │ │ ├── cbor.go │ │ │ │ ├── codecgen/ │ │ │ │ │ ├── gen.go │ │ │ │ │ └── z.go │ │ │ │ ├── decode.go │ │ │ │ ├── decode_go.go │ │ │ │ ├── decode_go14.go │ │ │ │ ├── encode.go │ │ │ │ ├── fast-path.generated.go │ │ │ │ ├── fast-path.not.go │ │ │ │ ├── gen-helper.generated.go │ │ │ │ ├── gen.generated.go │ │ │ │ ├── gen.go │ │ │ │ ├── gen_15.go │ │ │ │ ├── gen_16.go │ │ │ │ ├── gen_17.go │ │ │ │ ├── helper.go │ │ │ │ ├── helper_internal.go │ │ │ │ ├── helper_not_unsafe.go │ │ │ │ ├── helper_unsafe.go │ │ │ │ ├── json.go │ │ │ │ ├── msgpack.go │ │ │ │ ├── noop.go │ │ │ │ ├── prebuild.go │ │ │ │ ├── rpc.go │ │ │ │ ├── simple.go │ │ │ │ └── time.go │ │ │ └── xordataexchange/ │ │ │ └── crypt/ │ │ │ ├── backend/ │ │ │ │ ├── LICENSE │ │ │ │ ├── backend.go │ │ │ │ ├── consul/ │ │ │ │ │ └── consul.go │ │ │ │ ├── etcd/ │ │ │ │ │ └── etcd.go │ │ │ │ └── mock/ │ │ │ │ └── mock.go │ │ │ ├── config/ │ │ │ │ ├── LICENSE │ │ │ │ └── config.go │ │ │ └── encoding/ │ │ │ └── secconf/ │ │ │ ├── LICENSE │ │ │ └── secconf.go │ │ ├── golang.org/ │ │ │ └── x/ │ │ │ ├── crypto/ │ │ │ │ ├── cast5/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ └── cast5.go │ │ │ │ ├── curve25519/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── const_amd64.h │ │ │ │ │ ├── const_amd64.s │ │ │ │ │ ├── cswap_amd64.s │ │ │ │ │ ├── curve25519.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── freeze_amd64.s │ │ │ │ │ ├── ladderstep_amd64.s │ │ │ │ │ ├── mont25519_amd64.go │ │ │ │ │ ├── mul_amd64.s │ │ │ │ │ └── square_amd64.s │ │ │ │ ├── ed25519/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── ed25519.go │ │ │ │ │ └── internal/ │ │ │ │ │ └── edwards25519/ │ │ │ │ │ ├── const.go │ │ │ │ │ └── edwards25519.go │ │ │ │ ├── openpgp/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── armor/ │ │ │ │ │ │ ├── armor.go │ │ │ │ │ │ └── encode.go │ │ │ │ │ ├── canonical_text.go │ │ │ │ │ ├── clearsign/ │ │ │ │ │ │ └── clearsign.go │ │ │ │ │ ├── elgamal/ │ │ │ │ │ │ └── elgamal.go │ │ │ │ │ ├── errors/ │ │ │ │ │ │ └── errors.go │ │ │ │ │ ├── keys.go │ │ │ │ │ ├── packet/ │ │ │ │ │ │ ├── compressed.go │ │ │ │ │ │ ├── config.go │ │ │ │ │ │ ├── encrypted_key.go │ │ │ │ │ │ ├── literal.go │ │ │ │ │ │ ├── ocfb.go │ │ │ │ │ │ ├── one_pass_signature.go │ │ │ │ │ │ ├── opaque.go │ │ │ │ │ │ ├── packet.go │ │ │ │ │ │ ├── private_key.go │ │ │ │ │ │ ├── public_key.go │ │ │ │ │ │ ├── public_key_v3.go │ │ │ │ │ │ ├── reader.go │ │ │ │ │ │ ├── signature.go │ │ │ │ │ │ ├── signature_v3.go │ │ │ │ │ │ ├── symmetric_key_encrypted.go │ │ │ │ │ │ ├── symmetrically_encrypted.go │ │ │ │ │ │ ├── userattribute.go │ │ │ │ │ │ └── userid.go │ │ │ │ │ ├── read.go │ │ │ │ │ ├── s2k/ │ │ │ │ │ │ └── s2k.go │ │ │ │ │ └── write.go │ │ │ │ └── ssh/ │ │ │ │ ├── LICENSE │ │ │ │ ├── agent/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── forward.go │ │ │ │ │ ├── keyring.go │ │ │ │ │ └── server.go │ │ │ │ ├── buffer.go │ │ │ │ ├── certs.go │ │ │ │ ├── channel.go │ │ │ │ ├── cipher.go │ │ │ │ ├── client.go │ │ │ │ ├── client_auth.go │ │ │ │ ├── common.go │ │ │ │ ├── connection.go │ │ │ │ ├── doc.go │ │ │ │ ├── handshake.go │ │ │ │ ├── kex.go │ │ │ │ ├── keys.go │ │ │ │ ├── knownhosts/ │ │ │ │ │ └── knownhosts.go │ │ │ │ ├── mac.go │ │ │ │ ├── messages.go │ │ │ │ ├── mux.go │ │ │ │ ├── server.go │ │ │ │ ├── session.go │ │ │ │ ├── streamlocal.go │ │ │ │ ├── tcpip.go │ │ │ │ ├── terminal/ │ │ │ │ │ ├── terminal.go │ │ │ │ │ ├── util.go │ │ │ │ │ ├── util_bsd.go │ │ │ │ │ ├── util_linux.go │ │ │ │ │ ├── util_plan9.go │ │ │ │ │ ├── util_solaris.go │ │ │ │ │ └── util_windows.go │ │ │ │ ├── test/ │ │ │ │ │ └── doc.go │ │ │ │ └── transport.go │ │ │ ├── sys/ │ │ │ │ └── unix/ │ │ │ │ ├── LICENSE │ │ │ │ ├── asm_darwin_386.s │ │ │ │ ├── asm_darwin_amd64.s │ │ │ │ ├── asm_darwin_arm.s │ │ │ │ ├── asm_darwin_arm64.s │ │ │ │ ├── asm_dragonfly_amd64.s │ │ │ │ ├── asm_freebsd_386.s │ │ │ │ ├── asm_freebsd_amd64.s │ │ │ │ ├── asm_freebsd_arm.s │ │ │ │ ├── asm_linux_386.s │ │ │ │ ├── asm_linux_amd64.s │ │ │ │ ├── asm_linux_arm.s │ │ │ │ ├── asm_linux_arm64.s │ │ │ │ ├── asm_linux_mips64x.s │ │ │ │ ├── asm_linux_mipsx.s │ │ │ │ ├── asm_linux_ppc64x.s │ │ │ │ ├── asm_linux_s390x.s │ │ │ │ ├── asm_netbsd_386.s │ │ │ │ ├── asm_netbsd_amd64.s │ │ │ │ ├── asm_netbsd_arm.s │ │ │ │ ├── asm_openbsd_386.s │ │ │ │ ├── asm_openbsd_amd64.s │ │ │ │ ├── asm_solaris_amd64.s │ │ │ │ ├── bluetooth_linux.go │ │ │ │ ├── constants.go │ │ │ │ ├── dirent.go │ │ │ │ ├── endian_big.go │ │ │ │ ├── endian_little.go │ │ │ │ ├── env_unix.go │ │ │ │ ├── env_unset.go │ │ │ │ ├── flock.go │ │ │ │ ├── flock_linux_32bit.go │ │ │ │ ├── gccgo.go │ │ │ │ ├── gccgo_c.c │ │ │ │ ├── gccgo_linux_amd64.go │ │ │ │ ├── gccgo_linux_sparc64.go │ │ │ │ ├── mkpost.go │ │ │ │ ├── openbsd_pledge.go │ │ │ │ ├── race.go │ │ │ │ ├── race0.go │ │ │ │ ├── sockcmsg_linux.go │ │ │ │ ├── sockcmsg_unix.go │ │ │ │ ├── str.go │ │ │ │ ├── syscall.go │ │ │ │ ├── syscall_bsd.go │ │ │ │ ├── syscall_darwin.go │ │ │ │ ├── syscall_darwin_386.go │ │ │ │ ├── syscall_darwin_amd64.go │ │ │ │ ├── syscall_darwin_arm.go │ │ │ │ ├── syscall_darwin_arm64.go │ │ │ │ ├── syscall_dragonfly.go │ │ │ │ ├── syscall_dragonfly_amd64.go │ │ │ │ ├── syscall_freebsd.go │ │ │ │ ├── syscall_freebsd_386.go │ │ │ │ ├── syscall_freebsd_amd64.go │ │ │ │ ├── syscall_freebsd_arm.go │ │ │ │ ├── syscall_linux.go │ │ │ │ ├── syscall_linux_386.go │ │ │ │ ├── syscall_linux_amd64.go │ │ │ │ ├── syscall_linux_amd64_gc.go │ │ │ │ ├── syscall_linux_arm.go │ │ │ │ ├── syscall_linux_arm64.go │ │ │ │ ├── syscall_linux_mips64x.go │ │ │ │ ├── syscall_linux_mipsx.go │ │ │ │ ├── syscall_linux_ppc64x.go │ │ │ │ ├── syscall_linux_s390x.go │ │ │ │ ├── syscall_linux_sparc64.go │ │ │ │ ├── syscall_netbsd.go │ │ │ │ ├── syscall_netbsd_386.go │ │ │ │ ├── syscall_netbsd_amd64.go │ │ │ │ ├── syscall_netbsd_arm.go │ │ │ │ ├── syscall_no_getwd.go │ │ │ │ ├── syscall_openbsd.go │ │ │ │ ├── syscall_openbsd_386.go │ │ │ │ ├── syscall_openbsd_amd64.go │ │ │ │ ├── syscall_solaris.go │ │ │ │ ├── syscall_solaris_amd64.go │ │ │ │ ├── syscall_unix.go │ │ │ │ ├── syscall_unix_gc.go │ │ │ │ ├── types_darwin.go │ │ │ │ ├── types_dragonfly.go │ │ │ │ ├── types_freebsd.go │ │ │ │ ├── types_linux.go │ │ │ │ ├── types_netbsd.go │ │ │ │ ├── types_openbsd.go │ │ │ │ ├── types_solaris.go │ │ │ │ ├── zerrors_darwin_386.go │ │ │ │ ├── zerrors_darwin_amd64.go │ │ │ │ ├── zerrors_darwin_arm.go │ │ │ │ ├── zerrors_darwin_arm64.go │ │ │ │ ├── zerrors_dragonfly_amd64.go │ │ │ │ ├── zerrors_freebsd_386.go │ │ │ │ ├── zerrors_freebsd_amd64.go │ │ │ │ ├── zerrors_freebsd_arm.go │ │ │ │ ├── zerrors_linux_386.go │ │ │ │ ├── zerrors_linux_amd64.go │ │ │ │ ├── zerrors_linux_arm.go │ │ │ │ ├── zerrors_linux_arm64.go │ │ │ │ ├── zerrors_linux_mips.go │ │ │ │ ├── zerrors_linux_mips64.go │ │ │ │ ├── zerrors_linux_mips64le.go │ │ │ │ ├── zerrors_linux_mipsle.go │ │ │ │ ├── zerrors_linux_ppc64.go │ │ │ │ ├── zerrors_linux_ppc64le.go │ │ │ │ ├── zerrors_linux_s390x.go │ │ │ │ ├── zerrors_linux_sparc64.go │ │ │ │ ├── zerrors_netbsd_386.go │ │ │ │ ├── zerrors_netbsd_amd64.go │ │ │ │ ├── zerrors_netbsd_arm.go │ │ │ │ ├── zerrors_openbsd_386.go │ │ │ │ ├── zerrors_openbsd_amd64.go │ │ │ │ ├── zerrors_solaris_amd64.go │ │ │ │ ├── zsyscall_darwin_386.go │ │ │ │ ├── zsyscall_darwin_amd64.go │ │ │ │ ├── zsyscall_darwin_arm.go │ │ │ │ ├── zsyscall_darwin_arm64.go │ │ │ │ ├── zsyscall_dragonfly_amd64.go │ │ │ │ ├── zsyscall_freebsd_386.go │ │ │ │ ├── zsyscall_freebsd_amd64.go │ │ │ │ ├── zsyscall_freebsd_arm.go │ │ │ │ ├── zsyscall_linux_386.go │ │ │ │ ├── zsyscall_linux_amd64.go │ │ │ │ ├── zsyscall_linux_arm.go │ │ │ │ ├── zsyscall_linux_arm64.go │ │ │ │ ├── zsyscall_linux_mips.go │ │ │ │ ├── zsyscall_linux_mips64.go │ │ │ │ ├── zsyscall_linux_mips64le.go │ │ │ │ ├── zsyscall_linux_mipsle.go │ │ │ │ ├── zsyscall_linux_ppc64.go │ │ │ │ ├── zsyscall_linux_ppc64le.go │ │ │ │ ├── zsyscall_linux_s390x.go │ │ │ │ ├── zsyscall_linux_sparc64.go │ │ │ │ ├── zsyscall_netbsd_386.go │ │ │ │ ├── zsyscall_netbsd_amd64.go │ │ │ │ ├── zsyscall_netbsd_arm.go │ │ │ │ ├── zsyscall_openbsd_386.go │ │ │ │ ├── zsyscall_openbsd_amd64.go │ │ │ │ ├── zsyscall_solaris_amd64.go │ │ │ │ ├── zsysctl_openbsd.go │ │ │ │ ├── zsysnum_darwin_386.go │ │ │ │ ├── zsysnum_darwin_amd64.go │ │ │ │ ├── zsysnum_darwin_arm.go │ │ │ │ ├── zsysnum_darwin_arm64.go │ │ │ │ ├── zsysnum_dragonfly_amd64.go │ │ │ │ ├── zsysnum_freebsd_386.go │ │ │ │ ├── zsysnum_freebsd_amd64.go │ │ │ │ ├── zsysnum_freebsd_arm.go │ │ │ │ ├── zsysnum_linux_386.go │ │ │ │ ├── zsysnum_linux_amd64.go │ │ │ │ ├── zsysnum_linux_arm.go │ │ │ │ ├── zsysnum_linux_arm64.go │ │ │ │ ├── zsysnum_linux_mips.go │ │ │ │ ├── zsysnum_linux_mips64.go │ │ │ │ ├── zsysnum_linux_mips64le.go │ │ │ │ ├── zsysnum_linux_mipsle.go │ │ │ │ ├── zsysnum_linux_ppc64.go │ │ │ │ ├── zsysnum_linux_ppc64le.go │ │ │ │ ├── zsysnum_linux_s390x.go │ │ │ │ ├── zsysnum_linux_sparc64.go │ │ │ │ ├── zsysnum_netbsd_386.go │ │ │ │ ├── zsysnum_netbsd_amd64.go │ │ │ │ ├── zsysnum_netbsd_arm.go │ │ │ │ ├── zsysnum_openbsd_386.go │ │ │ │ ├── zsysnum_openbsd_amd64.go │ │ │ │ ├── zsysnum_solaris_amd64.go │ │ │ │ ├── ztypes_darwin_386.go │ │ │ │ ├── ztypes_darwin_amd64.go │ │ │ │ ├── ztypes_darwin_arm.go │ │ │ │ ├── ztypes_darwin_arm64.go │ │ │ │ ├── ztypes_dragonfly_amd64.go │ │ │ │ ├── ztypes_freebsd_386.go │ │ │ │ ├── ztypes_freebsd_amd64.go │ │ │ │ ├── ztypes_freebsd_arm.go │ │ │ │ ├── ztypes_linux_386.go │ │ │ │ ├── ztypes_linux_amd64.go │ │ │ │ ├── ztypes_linux_arm.go │ │ │ │ ├── ztypes_linux_arm64.go │ │ │ │ ├── ztypes_linux_mips.go │ │ │ │ ├── ztypes_linux_mips64.go │ │ │ │ ├── ztypes_linux_mips64le.go │ │ │ │ ├── ztypes_linux_mipsle.go │ │ │ │ ├── ztypes_linux_ppc64.go │ │ │ │ ├── ztypes_linux_ppc64le.go │ │ │ │ ├── ztypes_linux_s390x.go │ │ │ │ ├── ztypes_linux_sparc64.go │ │ │ │ ├── ztypes_netbsd_386.go │ │ │ │ ├── ztypes_netbsd_amd64.go │ │ │ │ ├── ztypes_netbsd_arm.go │ │ │ │ ├── ztypes_openbsd_386.go │ │ │ │ ├── ztypes_openbsd_amd64.go │ │ │ │ └── ztypes_solaris_amd64.go │ │ │ └── text/ │ │ │ ├── internal/ │ │ │ │ ├── gen/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── code.go │ │ │ │ │ └── gen.go │ │ │ │ ├── triegen/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── compact.go │ │ │ │ │ ├── print.go │ │ │ │ │ └── triegen.go │ │ │ │ └── ucd/ │ │ │ │ ├── LICENSE │ │ │ │ └── ucd.go │ │ │ ├── transform/ │ │ │ │ ├── LICENSE │ │ │ │ └── transform.go │ │ │ └── unicode/ │ │ │ ├── cldr/ │ │ │ │ ├── LICENSE │ │ │ │ ├── base.go │ │ │ │ ├── cldr.go │ │ │ │ ├── collate.go │ │ │ │ ├── decode.go │ │ │ │ ├── makexml.go │ │ │ │ ├── resolve.go │ │ │ │ ├── slice.go │ │ │ │ └── xml.go │ │ │ └── norm/ │ │ │ ├── LICENSE │ │ │ ├── composition.go │ │ │ ├── forminfo.go │ │ │ ├── input.go │ │ │ ├── iter.go │ │ │ ├── maketables.go │ │ │ ├── normalize.go │ │ │ ├── readwriter.go │ │ │ ├── tables.go │ │ │ ├── transform.go │ │ │ ├── trie.go │ │ │ └── triegen.go │ │ ├── gopkg.in/ │ │ │ └── yaml.v2/ │ │ │ ├── LICENSE │ │ │ ├── apic.go │ │ │ ├── decode.go │ │ │ ├── emitterc.go │ │ │ ├── encode.go │ │ │ ├── parserc.go │ │ │ ├── readerc.go │ │ │ ├── resolve.go │ │ │ ├── scannerc.go │ │ │ ├── sorter.go │ │ │ ├── writerc.go │ │ │ ├── yaml.go │ │ │ ├── yamlh.go │ │ │ └── yamlprivateh.go │ │ └── manifest │ ├── chapter4/ │ │ ├── mysql/ │ │ │ ├── main.go │ │ │ ├── main.go.txt │ │ │ ├── main_namsral.go │ │ │ ├── main_namsral.go.txt │ │ │ ├── main_pflag.go │ │ │ ├── main_pflag.go.txt │ │ │ ├── run │ │ │ ├── service/ │ │ │ │ └── database.go │ │ │ └── vendor/ │ │ │ ├── github.com/ │ │ │ │ ├── go-sql-driver/ │ │ │ │ │ └── mysql/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── appengine.go │ │ │ │ │ ├── buffer.go │ │ │ │ │ ├── collations.go │ │ │ │ │ ├── connection.go │ │ │ │ │ ├── const.go │ │ │ │ │ ├── driver.go │ │ │ │ │ ├── dsn.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── infile.go │ │ │ │ │ ├── packets.go │ │ │ │ │ ├── result.go │ │ │ │ │ ├── rows.go │ │ │ │ │ ├── statement.go │ │ │ │ │ ├── transaction.go │ │ │ │ │ └── utils.go │ │ │ │ ├── jmoiron/ │ │ │ │ │ └── sqlx/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── bind.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── named.go │ │ │ │ │ ├── named_context.go │ │ │ │ │ ├── reflectx/ │ │ │ │ │ │ └── reflect.go │ │ │ │ │ ├── sqlx.go │ │ │ │ │ ├── sqlx_context.go │ │ │ │ │ └── types/ │ │ │ │ │ └── types.go │ │ │ │ ├── namsral/ │ │ │ │ │ └── flag/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── examples/ │ │ │ │ │ │ └── gopher.go │ │ │ │ │ ├── extras.go │ │ │ │ │ └── flag.go │ │ │ │ └── spf13/ │ │ │ │ └── pflag/ │ │ │ │ ├── LICENSE │ │ │ │ ├── bool.go │ │ │ │ ├── bool_slice.go │ │ │ │ ├── count.go │ │ │ │ ├── duration.go │ │ │ │ ├── flag.go │ │ │ │ ├── float32.go │ │ │ │ ├── float64.go │ │ │ │ ├── golangflag.go │ │ │ │ ├── int.go │ │ │ │ ├── int32.go │ │ │ │ ├── int64.go │ │ │ │ ├── int8.go │ │ │ │ ├── int_slice.go │ │ │ │ ├── ip.go │ │ │ │ ├── ip_slice.go │ │ │ │ ├── ipmask.go │ │ │ │ ├── ipnet.go │ │ │ │ ├── string.go │ │ │ │ ├── string_array.go │ │ │ │ ├── string_slice.go │ │ │ │ ├── uint.go │ │ │ │ ├── uint16.go │ │ │ │ ├── uint32.go │ │ │ │ ├── uint64.go │ │ │ │ ├── uint8.go │ │ │ │ └── uint_slice.go │ │ │ └── manifest │ │ └── redis/ │ │ ├── redis1.go │ │ ├── redis1.go.txt │ │ ├── redis2.go │ │ ├── redis2.go.txt │ │ ├── redis3.go │ │ ├── redis3.go.txt │ │ ├── run │ │ ├── run_containers │ │ ├── service/ │ │ │ ├── now.go │ │ │ └── redis.go │ │ └── vendor/ │ │ ├── github.com/ │ │ │ └── garyburd/ │ │ │ └── redigo/ │ │ │ ├── internal/ │ │ │ │ ├── LICENSE │ │ │ │ ├── commandinfo.go │ │ │ │ └── redistest/ │ │ │ │ └── testdb.go │ │ │ └── redis/ │ │ │ ├── LICENSE │ │ │ ├── conn.go │ │ │ ├── doc.go │ │ │ ├── go17.go │ │ │ ├── log.go │ │ │ ├── pool.go │ │ │ ├── pre_go17.go │ │ │ ├── pubsub.go │ │ │ ├── redis.go │ │ │ ├── reply.go │ │ │ ├── scan.go │ │ │ └── script.go │ │ └── manifest │ ├── chapter7/ │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── api/ │ │ │ ├── health.go │ │ │ └── twitter.go │ │ ├── build.sh │ │ ├── build_static.sh │ │ ├── main.go │ │ ├── public_html/ │ │ │ ├── index.html │ │ │ └── index.js │ │ ├── run │ │ ├── run_docker │ │ ├── run_errcheck │ │ ├── run_golint │ │ ├── services/ │ │ │ ├── redis.go │ │ │ └── respond.go │ │ └── vendor/ │ │ ├── github.com/ │ │ │ ├── garyburd/ │ │ │ │ └── redigo/ │ │ │ │ ├── LICENSE │ │ │ │ ├── internal/ │ │ │ │ │ ├── commandinfo.go │ │ │ │ │ └── redistest/ │ │ │ │ │ └── testdb.go │ │ │ │ ├── redis/ │ │ │ │ │ ├── conn.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── go17.go │ │ │ │ │ ├── log.go │ │ │ │ │ ├── pool.go │ │ │ │ │ ├── pre_go17.go │ │ │ │ │ ├── pubsub.go │ │ │ │ │ ├── redis.go │ │ │ │ │ ├── reply.go │ │ │ │ │ ├── scan.go │ │ │ │ │ └── script.go │ │ │ │ └── redisx/ │ │ │ │ ├── connmux.go │ │ │ │ └── doc.go │ │ │ └── namsral/ │ │ │ └── flag/ │ │ │ ├── LICENSE │ │ │ ├── examples/ │ │ │ │ └── gopher.go │ │ │ ├── extras.go │ │ │ └── flag.go │ │ └── manifest │ ├── chapter8/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── haproxy/ │ │ │ └── haproxy.cfg │ │ ├── pm2_exec │ │ ├── pm2_haproxy │ │ ├── pm2_run │ │ └── process.yml │ ├── digitalocean/ │ │ ├── create.sh │ │ ├── destroy.sh │ │ ├── get-ip.sh │ │ ├── ssh.sh │ │ └── swarm/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── add-manager.sh │ │ ├── add-worker.sh │ │ ├── destroy.sh │ │ ├── list-managers.sh │ │ ├── list-swarm.sh │ │ ├── list-workers.sh │ │ ├── list.sh │ │ ├── remove-manager.sh │ │ ├── remove-worker.sh │ │ ├── ssh-key.sh │ │ ├── ssh-one.sh │ │ └── ssh.sh │ ├── scaleway/ │ │ ├── .gitignore │ │ ├── create.sh │ │ ├── destroy.sh │ │ ├── get-ip.sh │ │ ├── install.sh │ │ ├── list.sh │ │ ├── ssh.sh │ │ └── swarm/ │ │ ├── include/ │ │ │ └── common.sh │ │ └── scripts/ │ │ └── bootstrap.sh │ ├── services/ │ │ ├── mysql/ │ │ │ ├── .gitignore │ │ │ ├── bin/ │ │ │ │ └── run │ │ │ └── conf/ │ │ │ ├── .my.cnf │ │ │ └── conf.d/ │ │ │ ├── .placeholder │ │ │ └── skipresolve.conf │ │ ├── redis/ │ │ │ ├── bin/ │ │ │ │ ├── redis-cli │ │ │ │ ├── run │ │ │ │ └── shutdown │ │ │ └── docker.image │ │ └── registry/ │ │ ├── .gitignore │ │ └── bin/ │ │ ├── purge │ │ └── run │ └── shell/ │ ├── .gitignore │ ├── docker_network │ ├── gogs │ ├── gogs_backup │ └── mysql ├── LICENSE ├── README.md └── api-foundations/ ├── .gitignore ├── chapter1/ │ ├── hello_world.go │ └── run ├── chapter2/ │ ├── bootstrap/ │ │ └── now.go │ ├── chapter2b.go │ ├── reflection.go │ ├── run │ ├── type1.go │ ├── type2.go │ ├── type3.go │ └── type5.go ├── chapter3/ │ ├── example1.go │ ├── example1.json │ ├── example2.go │ ├── example2.json │ ├── example3.go │ ├── example3.txt │ └── run ├── chapter4/ │ ├── run │ ├── server1.go │ ├── server2.go │ ├── server3.go │ ├── server4.go │ └── server5.go ├── chapter4b/ │ ├── Gopkg.toml │ ├── run │ ├── server1.go │ ├── server2.go │ ├── server3.go │ ├── server4.go │ └── vendor/ │ └── github.com/ │ └── go-chi/ │ ├── chi/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── _examples/ │ │ │ ├── custom-handler/ │ │ │ │ └── main.go │ │ │ ├── custom-method/ │ │ │ │ └── main.go │ │ │ ├── fileserver/ │ │ │ │ ├── files/ │ │ │ │ │ └── notes.txt │ │ │ │ └── main.go │ │ │ ├── graceful/ │ │ │ │ └── main.go │ │ │ ├── hello-world/ │ │ │ │ └── main.go │ │ │ ├── limits/ │ │ │ │ └── main.go │ │ │ ├── logging/ │ │ │ │ └── main.go │ │ │ ├── rest/ │ │ │ │ ├── main.go │ │ │ │ ├── routes.json │ │ │ │ └── routes.md │ │ │ ├── router-walk/ │ │ │ │ └── main.go │ │ │ ├── todos-resource/ │ │ │ │ ├── main.go │ │ │ │ ├── todos.go │ │ │ │ └── users.go │ │ │ └── versions/ │ │ │ ├── data/ │ │ │ │ ├── article.go │ │ │ │ └── errors.go │ │ │ ├── main.go │ │ │ └── presenter/ │ │ │ ├── v1/ │ │ │ │ └── article.go │ │ │ ├── v2/ │ │ │ │ └── article.go │ │ │ └── v3/ │ │ │ └── article.go │ │ ├── chain.go │ │ ├── chi.go │ │ ├── context.go │ │ ├── middleware/ │ │ │ ├── closenotify17.go │ │ │ ├── closenotify18.go │ │ │ ├── compress.go │ │ │ ├── compress18.go │ │ │ ├── content_charset.go │ │ │ ├── content_charset_test.go │ │ │ ├── content_type.go │ │ │ ├── get_head.go │ │ │ ├── get_head_test.go │ │ │ ├── heartbeat.go │ │ │ ├── logger.go │ │ │ ├── middleware.go │ │ │ ├── middleware18_test.go │ │ │ ├── middleware_test.go │ │ │ ├── nocache.go │ │ │ ├── profiler.go │ │ │ ├── realip.go │ │ │ ├── realip_test.go │ │ │ ├── recoverer.go │ │ │ ├── request_id.go │ │ │ ├── strip.go │ │ │ ├── strip_test.go │ │ │ ├── terminal.go │ │ │ ├── throttle.go │ │ │ ├── throttle_test.go │ │ │ ├── timeout.go │ │ │ ├── url_format.go │ │ │ ├── value.go │ │ │ ├── wrap_writer.go │ │ │ ├── wrap_writer17.go │ │ │ └── wrap_writer18.go │ │ ├── mux.go │ │ ├── mux_test.go │ │ ├── testdata/ │ │ │ ├── cert.pem │ │ │ └── key.pem │ │ ├── tree.go │ │ └── tree_test.go │ └── cors/ │ ├── README.md │ ├── _example/ │ │ └── main.go │ ├── cors.go │ └── utils.go ├── chapter4b-jwt/ │ ├── Gopkg.toml │ ├── jwt.go │ ├── main.go │ ├── run.sh │ └── vendor/ │ └── github.com/ │ ├── dgrijalva/ │ │ └── jwt-go/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── MIGRATION_GUIDE.md │ │ ├── README.md │ │ ├── VERSION_HISTORY.md │ │ ├── claims.go │ │ ├── cmd/ │ │ │ └── jwt/ │ │ │ ├── README.md │ │ │ ├── app.go │ │ │ └── args.go │ │ ├── doc.go │ │ ├── ecdsa.go │ │ ├── ecdsa_test.go │ │ ├── ecdsa_utils.go │ │ ├── errors.go │ │ ├── example_test.go │ │ ├── hmac.go │ │ ├── hmac_example_test.go │ │ ├── hmac_test.go │ │ ├── http_example_test.go │ │ ├── map_claims.go │ │ ├── none.go │ │ ├── none_test.go │ │ ├── parser.go │ │ ├── parser_test.go │ │ ├── request/ │ │ │ ├── doc.go │ │ │ ├── extractor.go │ │ │ ├── extractor_example_test.go │ │ │ ├── extractor_test.go │ │ │ ├── oauth2.go │ │ │ ├── request.go │ │ │ └── request_test.go │ │ ├── rsa.go │ │ ├── rsa_pss.go │ │ ├── rsa_pss_test.go │ │ ├── rsa_test.go │ │ ├── rsa_utils.go │ │ ├── signing_method.go │ │ ├── test/ │ │ │ ├── ec256-private.pem │ │ │ ├── ec256-public.pem │ │ │ ├── ec384-private.pem │ │ │ ├── ec384-public.pem │ │ │ ├── ec512-private.pem │ │ │ ├── ec512-public.pem │ │ │ ├── helpers.go │ │ │ ├── hmacTestKey │ │ │ ├── privateSecure.pem │ │ │ ├── sample_key │ │ │ └── sample_key.pub │ │ └── token.go │ ├── go-chi/ │ │ ├── chi/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── _examples/ │ │ │ │ ├── custom-handler/ │ │ │ │ │ └── main.go │ │ │ │ ├── custom-method/ │ │ │ │ │ └── main.go │ │ │ │ ├── fileserver/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ └── notes.txt │ │ │ │ │ └── main.go │ │ │ │ ├── graceful/ │ │ │ │ │ └── main.go │ │ │ │ ├── hello-world/ │ │ │ │ │ └── main.go │ │ │ │ ├── limits/ │ │ │ │ │ └── main.go │ │ │ │ ├── logging/ │ │ │ │ │ └── main.go │ │ │ │ ├── rest/ │ │ │ │ │ ├── main.go │ │ │ │ │ ├── routes.json │ │ │ │ │ └── routes.md │ │ │ │ ├── router-walk/ │ │ │ │ │ └── main.go │ │ │ │ ├── todos-resource/ │ │ │ │ │ ├── main.go │ │ │ │ │ ├── todos.go │ │ │ │ │ └── users.go │ │ │ │ └── versions/ │ │ │ │ ├── data/ │ │ │ │ │ ├── article.go │ │ │ │ │ └── errors.go │ │ │ │ ├── main.go │ │ │ │ └── presenter/ │ │ │ │ ├── v1/ │ │ │ │ │ └── article.go │ │ │ │ ├── v2/ │ │ │ │ │ └── article.go │ │ │ │ └── v3/ │ │ │ │ └── article.go │ │ │ ├── chain.go │ │ │ ├── chi.go │ │ │ ├── context.go │ │ │ ├── middleware/ │ │ │ │ ├── closenotify17.go │ │ │ │ ├── closenotify18.go │ │ │ │ ├── compress.go │ │ │ │ ├── compress18.go │ │ │ │ ├── content_charset.go │ │ │ │ ├── content_charset_test.go │ │ │ │ ├── content_type.go │ │ │ │ ├── get_head.go │ │ │ │ ├── get_head_test.go │ │ │ │ ├── heartbeat.go │ │ │ │ ├── logger.go │ │ │ │ ├── middleware.go │ │ │ │ ├── middleware18_test.go │ │ │ │ ├── middleware_test.go │ │ │ │ ├── nocache.go │ │ │ │ ├── profiler.go │ │ │ │ ├── realip.go │ │ │ │ ├── realip_test.go │ │ │ │ ├── recoverer.go │ │ │ │ ├── request_id.go │ │ │ │ ├── strip.go │ │ │ │ ├── strip_test.go │ │ │ │ ├── terminal.go │ │ │ │ ├── throttle.go │ │ │ │ ├── throttle_test.go │ │ │ │ ├── timeout.go │ │ │ │ ├── url_format.go │ │ │ │ ├── value.go │ │ │ │ ├── wrap_writer.go │ │ │ │ ├── wrap_writer17.go │ │ │ │ └── wrap_writer18.go │ │ │ ├── mux.go │ │ │ ├── mux_test.go │ │ │ ├── testdata/ │ │ │ │ ├── cert.pem │ │ │ │ └── key.pem │ │ │ ├── tree.go │ │ │ └── tree_test.go │ │ └── cors/ │ │ ├── README.md │ │ ├── _example/ │ │ │ └── main.go │ │ ├── cors.go │ │ └── utils.go │ ├── pkg/ │ │ └── errors/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── appveyor.yml │ │ ├── bench_test.go │ │ ├── errors.go │ │ ├── errors_test.go │ │ ├── example_test.go │ │ ├── format_test.go │ │ ├── stack.go │ │ └── stack_test.go │ └── titpetric/ │ └── factory/ │ ├── LICENSE │ ├── README.md │ ├── database.go │ ├── profiler.go │ ├── resputil/ │ │ └── resputil.go │ ├── semaphore.go │ └── sonyflake.go ├── chapter5/ │ ├── apiservice/ │ │ └── apiservice.go │ ├── bootstrap/ │ │ └── now.go │ ├── run │ ├── server1.go │ ├── server2.go │ └── server3.go ├── chapter6/ │ ├── bootstrap/ │ │ ├── now.go │ │ ├── redigo.go │ │ ├── redigo.go.txt │ │ └── redis.go │ ├── redis1.go │ ├── redis1.go.txt │ ├── redis2.go │ ├── redis2.go.txt │ ├── redis3.go │ ├── redis3.go.txt │ ├── run │ └── run_containers ├── chapter6b/ │ ├── bootstrap/ │ │ ├── now.go │ │ └── sqlx.go │ ├── main_sql.go │ ├── main_sql.go.txt │ ├── main_sqlx.go │ ├── main_sqlx.go.txt │ ├── main_sqlx2.go │ ├── main_sqlx2.go.txt │ ├── main_sqlx3.go │ ├── main_sqlx3.go.txt │ └── run ├── chapter7/ │ ├── .gitignore │ ├── run │ ├── t1/ │ │ ├── bootstrap/ │ │ │ ├── now.go │ │ │ ├── redigo.go │ │ │ └── redis.go │ │ ├── registry.go │ │ └── registry_test.go │ ├── t2/ │ │ ├── bootstrap/ │ │ │ ├── now.go │ │ │ ├── redigo.go │ │ │ └── redis.go │ │ ├── registry.go │ │ └── registry_test.go │ └── t3/ │ ├── bootstrap/ │ │ ├── now.go │ │ ├── redigo.go │ │ └── redis.go │ ├── registry.go │ └── registry_test.go ├── chapter8/ │ ├── .gitignore │ ├── api/ │ │ ├── registry.go │ │ └── registry_test.go │ ├── bootstrap/ │ │ ├── now.go │ │ ├── redigo.go │ │ └── redis.go │ ├── redis_api.go │ ├── redis_api2.go │ ├── redis_api_pprof.go │ ├── run │ ├── run_benchmark │ ├── test_curl │ ├── test_pprof │ └── test_torch ├── chapter9/ │ ├── .gitignore │ ├── Dockerfile │ ├── api/ │ │ ├── registry.go │ │ └── registry_test.go │ ├── bootstrap/ │ │ ├── now.go │ │ ├── redigo.go │ │ └── redis.go │ ├── build_docker │ ├── build_flags │ ├── flags.go │ ├── flags.sh │ ├── redis_api.go │ ├── test-flags │ ├── test-flags.txt │ ├── test-flags2 │ ├── test-flags2.txt │ └── test-remote.txt └── shell/ ├── common.sh └── go